本文介绍 Spring Security 用户名 / 密码认证相关原理。
目录
- 用户名 / 密码的读取 / 存储机制
- 表单登录
- 基本认证
- 摘要认证
- 内存认证
- JDBC 认证
- UserDetails
- UserDetailsService
- PasswordEncoder
- DaoAuthenticationProvider
- LDAP 认证
用户名 / 密码的读取 / 存储机制
Spring Security提供了以下内置机制,用于从 HttpServletRequest
中读取用户名和密码:
- Form 表单登录
- 基本认证
- 摘要认证
存储机制:
- 基于内存认证的简单存储
- 基于 JDBC 认证的关系型数据库
- 使用
UserDetailsService
的自定义数据存储 - 基于 LDAP 认证的 LDAP 存储
表单登录
Spring Security 基于表单的登录流程:
- 首先,用户发起未经身份认证的请求;
-
FilterSecurityInterceptor
抛出一个AccessDeniedException
异常拒绝了请求; - 因为用户未被认证,
ExceptionTranslationFilter
启动认证并使用已配置的AuthenticationEntryPoint
将请求重定向到登录页面,大多数情况下AuthenticationEntryPoint
是一个LoginUrlAuthenticationEntryPoint
实例; - 浏览器将请求重定向到登录页面。
UsernamePasswordAuthenticationFilter
会验证提交的用户名和密码,UsernamePasswordAuthenticationFilter
继承自 AbstractAuthenticationProcessingFilter
,流程如下:
- 用户提交了用户名和密码后,
UsernamePasswordAuthenticationFilter
创建了一个UsernamePasswordAuthenticationToken
。UsernamePasswordAuthenticationToken
是Authentication
的一个子类,将用户名和密码从HttpServletRequest
中提取出来; -
UsernamePasswordAuthenticationToken
传递给AuthenticationManager
用于身份认证。AuthenticationManager
的详细信息取决于用户信息的存储方式; - 如果认证失败,执行以下动作:
-
SecurityContextHolder
被清空; - 调用
RememberMeServices.loginFail
,如果未配置Remember Me
则忽略; - 调用
AuthenticationFailureHandler
-
- 如果认证成功,执行以下动作:
- 通知
SessionAuthenticationStrategy
有新的登录; - 在
SecurityContextHolder
上设置Authentication
; - 调用
RememberMeServices.loginSuccess
,如果未配置Remember Me
则忽略; -
ApplicationEventPublisher
发布一个InteractiveAuthenticationSuccessEvent
事件; - 调用
AuthenticationSuccessHandler
,通常是一个SimpleUrlAuthenticationSuccessHandler
。
- 通知
Spring Security 默认启用了 Form 表单登录,配置方法如下:
- Java 配置
protected void configure(HttpSecurity http) { http // ... .formLogin(withDefaults()); }
- XML 配置
<http> <!-- ... --> <form-login /> </http>
网友评论