Spring Security的认证设计
通过对应的AuthenticationProvider
对特定的Authentication
进行认证处理。
- SecurityContextHolder, 认证成功后, 可以在后续的处理中通过它来获取认证后的用户信息
Authentication Design
常见的认证方式
DaoAuthenticationProvider
用于对username/password这种形式的认证信息进行校验, 认证信息通过UsernamePasswordAuthenticationToken
进行包装. 其中password可以从本地服务中获取.
通过UserDetailsService
来查询username来获取对应的UserDetails用户信息, 包括用于校验的密码信息.
由于密码往往通过某种加密方式加密后保存, 所以需要通过PasswordEncoder对输入的password进行加密后, 再同UserDetails中的密码信息进行比较.
对FormLogin的支持
- LoginUrlAuthenticationEntryPoint, 在认证失败时, 重导向到登录页面
- UsernamePasswordAuthenticationFilter处理登录页面的认证请求
对Basic的支持
- BasicAuthenticationEntryPoint, 在认证失败时返回WWW-Authenticate头信息
- BasicAuthenticationFilter, 处理Basic认证请求
Pre-Authentication Framework对第三方认证的集成
- AbstractPreAuthenticatedProcessingFilter, Pre-Authentication Framework的入口
- PreAuthenticatedAuthenticationToken, 包含第三方的用户校验信息或者认证成功后的用户信息
- PreAuthenticatedAuthenticationProvider, Pre-Authentication Framework默认的校验器
- AuthenticationUserDetailsService, 同第三方进行校验, 在校验成功后获取系统中的用户信息
Session管理
Http Session相关的功能都在以下组件中进行处理:
- SessionManagementFilter
- SessionAuthenticationStrategy, 对认证成功的用户进行session校验
- SessionRegistry, 存储session和认证后的用户信息的键值对
主要处理以下问题:
- 防御会话固定攻击(session-fixation protection attack)
- SessionFixationProtectionStrategy
- 检查Session是否超时
- InvalidSessionStrategy, 对无效session进行处理
- 限制用户的同时登录数
- ConcurrentSessionFilter
- ConcurrentSessionControlAuthenticationStrategy
登出处理
登出时会对用户相关的登录信息进行清理:
- session无效化
- 清理SecurityContextHolder
- 重导向到登录页面
- 清理Cookies
通过LogoutHandler进行清理, 不可以抛出异常.
LogoutSuccessHandler在logout成功后, 进行重定向(默认为/login?logout)或者返回指定的http status code(默认为200).