security详解 + 项目搭建代码
Security框架
security是通过一个个过滤器来完成用户的认证授权,每个过滤器都有自己的职责,使得设计清晰明了,也容易学习。
主要对象介绍
1 .SecurityFilterChain
Security里面配置了各种各样的过滤器,将所有的Security过滤器组装在SecurityFilterChain中。
通过继承了Filter的DelegatingFilterProxy代理FilterChainProxy,FilterChainProxy中内部封装SecurityFilterChain,
再调用SecurityFilterChain中的过滤器
2. SecurityFilterChain默认的过滤器介绍
-
WebAsyncManagerIntegrationFilter
此过滤器用于集成SecurityContext到Spring异步执行机制中的
-
SecurityContextPersistenceFilter
首当其冲的一个过滤器,作用之重要,自不必多言。SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续filter建立所需的上下文。SecurityContext中存储了当前用户的认证以及权限信息
-
HeaderWriterFilter
向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制org.springframework.security.web.csrf.CsrfFiltercsrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的token信息,如果不包含,则报错。起到防止csrf攻击的效果。
-
CsrfFilter
crsf拦截处理,配合对应的security标签使用
-
LogoutFilter
匹配URL为/logout的请求,实现用户退出,清除认证信息。
-
UsernamePasswordAuthenticationFilter
登录认证器
内部设置了登录的url,且只能是post请求,首先会匹配user是否为登录,然后验证Context中的
-
DefaultLoginPageGeneratingFilter
针对login的url返回一个登录的页面,创建一个登录的页面
-
DefaultLogoutPageGeneratingFilter
针对logout的url返回一个登录的页面,创建一个登录的页面
-
BasicAuthenticationFilter
此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头信息。
-
RequestCacheAwareFilter
通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存
-
SecurityContextHolderAwareRequestFilter
针对ServletRequest进行了一次包装,使得request具有更加丰富的API
-
AnonymousAuthenticationFilter
当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到SecurityContextHolder中。spring security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
用户名为anonymousUser
用户角色为ROLE_ANONYMOUS
-
SessionManagementFilter
限制同一用户开启多个会话的数量
-
ExceptionTranslationFilter
常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异常
-
FilterSecurityInterceptor
获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其是否有权限。
注意当我们实现WebSecurityConfigurerAdapter类自定义配置Security,空配置会使得过滤器链缺少以下过滤器配置
CrsFilter、UsernameFilter、LoginPageGeneratingFilter、LogoutPageGeneratingFilter、BasicAuthticationFIlter
3. AuthenticationManager认证管理器
认证管理器,涉及token的生成、持久化、比对。
SecurityContextRepository
token的持久化对象,在spring-boot-starter-security中,是依托session机制来实现的。
该类在过滤器SecurityContextPersistenceFilter
该接口实现为HttpSessionSecurityContextRepository
很简单的就是从session中获取SecurityContext对象,没有登录的就创建个SecurityConext返回
SecurityContext
认证信息上下文,里面存着Authentication。也就是用户的信息,角色信息也全在这个对象里面。
SecurityContextHolder
获取上ContextContext的工具,也就是后面的执行方法都可以通过该工具获取SecurityContext对象了。例如在我们代码中获取登陆用户的信息,就直接通过该类获取,简单又方便。
ProviderManager
认证管理器提供者,被UsernamePasswordAuthenticationFilter封装,内部又分装认证方法的实现提供 AuthenticationProvider。
用来对比表单提供的用户信息与系统内的用户信息,来判断是否是用户本人。
AuthenticationProvider
认证方法实现,此类有两种实现DaoAuthenticationProvider、AnonymousAuthenticationProvider提供两种不同的Authentication
内部包含了UserDetails实体的检查,例如isLock isEnabled等
UserDetailsService
该接口只有一个方法,提供用户名,查询系统的用户信息。目的是为了与表单信息作比对。记住权限信息也是这个时候塞入的。
4. 鉴权对象
SecurityMetadataSource
该类主要方法是Collection
getAttributes(Object var1)。通过入参获取访问的资源url,然后自己通过该url去寻找需要哪些权限字符,然后返回。重写需继承FilterInvocationSecurityMetadataSource
AccessDecisionManager
该类是决策器,判断接口是否放行,默认实现为AffirmativeBased。通过SecurityMetadataSource返回的权限字符,与认证信息中的权限信息对比,判断是否有该权限信息,有就放行,无则拒绝。认证信息即SecurityContext中的Authentication。
5.失败处理对象
security默认的失败对象,都是页面,不好解析,可以通过此方法实现自定义的返回结果。
AuthenticationEntryPoint
认证流程中出现AuthenticationException类型的异常,将通过此方法实现类回调
AccessDeniedHandler
授权出现AccessDeniedException类型的异常,将通过此方法实现回调
6.WebSecurityConfigurerAdapter
security核心配置类,主要有以下三个方法需要知道
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true, securedEnabled = true)
public class SecurityConfigAdapterImpl extends WebSecurityConfigurerAdapter {
//该方法用来放行静态资源
public void configure(WebSecurity web) ;
//该方法是用来配置过滤器,及其过滤器的属性
protected void configure(HttpSecurity http)
//该方法就是方会认证对象,但是认证对象没有注入容器,需重写该方法并添加@Bean注入spring容器
public AuthenticationManager authenticationManagerBean()
}
Security认证授权流程
项目搭建源码+数据库
gittee源码 https://gitee.com/stone_1998/security_learn.git
如有不足,请纠正谢谢