Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(六):Spring Boot SSO
Web应用的安全管理,主要包括两个方面的内容:
- 一方面是用户身份认证,即用户登录的设计;
- 另一方面就是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理
5.1 依赖配置管理
spring-cloud-starter-parent
spring-cloud-starter-security
5.2 安全策略配置
关于系统的安全管理以及各种设计,Spring Security已经大体上都已经实现了,只需要进行一些配置和引用,就能够正常使用;
自定义配置类继承WebSecurityConfigurationAdapter
重写configure方法,对HttpSecurity进行一些安全策略的配置:
- loginPage:设置一个使用自定义的登录页面URL
- loginSuccessHandler:登录成功处理器
- permitAll:完全允许访问的一些URL配置,可以使用通配符
- logout:
- logoutSuccessUrl:
- rememberMe:用来记住用户的登录状态,即用户没有执行退出的时候,再次打来页面将不用登录
- csrf:这个一个防止跨站请求伪造攻击的策略设置;
- AccessDeniedPage:配置一个拒绝访问的提示链接
1. 权限管理配置
可以在配置文件中进行相应的配置:
2. 登录成功处理器
3. 防攻击策略
因为Spring Security的跨站请求伪造(cross-site request forgery,CSRF)即阻止跨站请求伪造攻击的功能很完善,所以使用Spring Security之后,对于新建、修改和删除操作,必须进行特殊的处理,才能正常使用。
要求在所有具有上面操作请求的页面中加入如下代码片段:可以将其放入到公共页面中,然后在其他的页面中引用。
<meta name=”_csrf” th:content=”${_csrf.token}” />
<meta name=”_csrf_header” th:content=”${_csrf.headerName}” />
另外加入如下js:功能就是在表单提交的时候放入一个token,服务端验证该token是否有效,只允许有效的token请求,否则拒绝当前操作
$(function (){
var token=$(“meta[name=’ _csrf’]]”).attr(“content”);
var header=$(“meta[name=’ _csrf_header’]”) .attr(“content”);
$(document).ajaxSend(function(e,xhr,options)){
xhr.setRequestHeader(header,token);
});
});
如果要对第三方开放接口,就只能对特定的URL使用排除CSRF保护的方法来实现了。
4. 记住登录状态
rememberMe().tokenValiditySeconds(86400).tokenRepository(tokenRepository()),它是用来记住用户登录状态的一个配置。
为了实现这个功能,需要将一个用户的登录令牌等信息保存在数据库中;
Spring Security提供了一个实体类,对应persistent_logins这个表;
5.3 登录认证设计
1. 用户实体建模
2. 用户身份验证
3. 登录界面设计
4. 验证码验证
5.4 权限管理设计
1. 权限管理配置
2. 权限管理过滤器
继承于Spring Security的AbstractSecurityInterceptor,实时监控用户的行为,防止用户访问未经过授权的资源;
3. 权限配置资源管理器
权限配置资源管理器实现了Spring Security 的FilterInvocationSecurityMetadataSource,它在启动的时候导入权限配置列表,权限配置资源管理器为权限决定器实时提供支持,判断用户访问的资源是否在受保护的范围之内;
4. 权限管理决断器
实现Spring Security的AccessDecisionManage,重载了decide函数,使用了自定义的决断管理
用户访问受保护的资源的时候,决断器判断用户是否对该资源具有访问权限,如果没有权限将拒绝访问,并提供错误提示;
5.5 根据权限设置链接
5.6 运行与发布
1. 系统初始化
2. 系统运行与发布
5.7 小结
源代码地址: