本文介绍 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>









网友评论