认证的工作原理
过滤链
 
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请求对象保存都安全上下文中,方便在业务类中随时获取




















