认证的工作原理
过滤链
Spring Security框架的作用就是安全访问控制
即对所有进入系统的请求进行拦截, 校验每个请求是否能够访问到它所期望的资源
通过Filter或AOP
等技术可以实现安全访问控制功能,而Spring Security对Web资源的保护是靠Filter实现的,Spring Security
有一个过滤链
Spring Security框架中真正起作用的是FilterChainProxy
中的SecurityFilterChain
所包含的各个Filter
过滤器 | 功能 |
---|---|
SecurityContextPresistenceFilter | 整个拦截过程的入口和出口即第一个和最后一个拦截器 在请求开始时从配置好的 SecurityContextRepository 中获取SecurityContext 给SecurityContextHolder在请求完成后将SecurityContextRepository持有的SecurityContext再保存到配置好的SecurityContextRepository,同时清除SecurityContextHolder所持有的SecurityContext |
UsernamePasswordAuthenticationFilter | 处理来自表单提交的认证,要求表单必须提供对应的用户名和密码 其内部还有登录成功或失败后进行处理的 AuthenticationSuccessHandler和AuthenticationFailureHandler |
FilterSecurityInterceptor | 用于保护web资源的,使用AccessDecisionManager 对当前用户进行授权访问 |
ExceptionTranslationFilter | 捕获来自 FilterChain所有的异常并进行处理 它只会处理 AuthenticationException和AccessDeniedException 这两类异常,其它的异常它会继续抛出 |
认证流程
Spring Security的执行流程如下
- 用户提交的
用户名、密码
被SecurityFilterChain中的UsernamePasswordAuthenticationFilter
过滤器获取到并把其封装到Authentication
请求对象中 UsernamePasswordAuthenticationFilter
过滤器将Authentication
请求对象提交至认证管理器AuthenticationManager
进行认证- 认证管理器有个实现类列表
List<XxxAuthenticationProvider>
负责完成实际认证工作,不同的实现类代表不同的认证方式,如web表单
的实现类为DaoAuthenticationProvider
,其内部维护着一个UserDetailsService
负责从数据库中获取用户信息UserDetails(实体类)
DaoAuthenticationProvider
会将用户提交的表单信息和从数据库中查询到的用户信息进行认证比对(如密码比对),如果验证通过会将查询到用户的权限,身份
等细节信息填充到提交的Authentication
请求对象中- 通过
SecurityContextHolder(安全上下文容器)
将包含了用户权限,身份
等细节信息的Authentication
请求对象保存都安全上下文中,方便在业务类中随时获取