1、spring-security简介
安全验证框架spring-security,是spring家族的一员,是一个重量级的安全验证框架,其自定义程度高,但是配置繁琐,配合springboot使用可大大较少配置的过程,提高开发效率。其核心功能可分为两个部分,认证和授权。
2、底层实现
spring-security本质可以理解为一个“过滤器连”,由一个个功能相互独立的过滤器组成,这些过滤器有着自己相对应的功能,每一个过滤器的执行必须在上一个过滤器放行之后,这些多个过滤器组成一个过滤链。
3、解析源码看过滤器执行原理以FilterSecurityInterceptor方法过滤器为例,FilterSecurityInterceptor过滤器是过滤连最底层的过滤器
(1)首先获取执行的目标对象:doFilter()方法获取对象,这是真正的执行过滤的方法。
(2)然后判断上一个过滤器是否放行:在调用invoke()方法执行对象时会先检查上个过滤器是否放行。
(3)基本执行过程可分为,获取请求对象,判断上级过滤器是否放行,执行过滤过逻辑放行。
4、过滤器加载
(1)首先配置DelegatingFilterProxy过滤器(springboot集成的话不需要手动配置,springboot框架会自配置)
5、web用户名和密码验证流程
在spring-security验证过程中框架会首先从配置文件和配置类中去找登录密码和用户名,如果在配置文件和配置类中没有找到用户名和密码的设置就去找UserDetailsService接口中设置的密码。
6、设置自定义的登录页面和需要放行的请求
再Security配置文件中重写configure方法:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin() //该方法表示登录时跳转到我们自定义的登录页面
.loginPage("login.html") //登录页地址
.loginProcessingUrl("/user/login") //登录访问路径
.defaultSuccessUrl("/test/index").permitAll() //认证成功后跳转的路径
.and().authorizeRequests()
.antMatchers("/","/test/hello","/user/login").permitAll() //设置放行的请求
.anyRequest().authenticated()
.and().csrf().disable(); //关闭csrf防护
}
7、基于用户权限做访问控制
使用hasAuthority()方法实现一个用户对应一个权限,使用hasAnyAuthority(()方法可将一个访问路径分配给多个权限。
(1)在配置文件中作如下设置:
(2)在UserDetailsService返回的用户对象中添加权限信息: