存储机制
每种支持读取用户名和密码的机制均可使用任意一种支持的存储机制:
-
使用内存认证的简单存储
-
使用JDBC认证的关系型数据库
-
使用UserDetailsService的自定义数据存储
-
使用LDAP认证的 LDAP 存储
章节总结
📄️ 内存中
Spring Security 的 InMemoryUserDetailsManager 实现了 UserDetailsService 接口,为基于用户名/密码的身份验证提供支持,这些凭据存储在内存中。InMemoryUserDetailsManager 通过实现 UserDetailsManager 接口来管理 UserDetails。当 Spring Security 配置为接受用户名和密码进行身份验证时,就会使用基于 UserDetails 的身份验证。
📄️ JDBC
Spring Security 的 JdbcDaoImpl 实现了 UserDetailsService 接口,以提供对基于用户名和密码的身份验证的支持,这些凭证通过 JDBC 进行检索。JdbcUserDetailsManager 扩展了 JdbcDaoImpl,通过 UserDetailsManager 接口提供对 UserDetails 的管理功能。当 Spring Security 被配置为接受用户名/密码进行身份验证时,就会使用基于 UserDetails 的身份验证。
📄️ 用户详情
UserDetails 由 UserDetailsService 返回。DaoAuthenticationProvider 验证 UserDetails,然后返回一个 Authentication 对象,其 principal 即为配置的 UserDetailsService 所返回的 UserDetails。
📄️ CredentialsContainer
CredentialsContainer接口表明实现对象包含敏感数据,Spring Security在内部使用该接口在成功认证后清除认证凭据。大多数Spring Security内部领域类都实现了此接口,例如User和UsernamePasswordAuthenticationToken。
📄️ 密码擦除
成功认证后,从内存中清除凭证是一种安全最佳实践,可防止凭证在潜在的内存转储攻击中被泄露。Spring Security 中的 ProviderManager 通过 eraseCredentials 方法支持这一实践,该方法应在认证过程完成后调用。
📄️ UserDetailsService
UserDetailsService 被 DaoAuthenticationProvider 用于检索用户名、密码以及其他属性,以便通过用户名和密码进行身份验证。Spring Security 提供了 UserDetailsService 的内存、JDBC 和缓存实现。
📄️ 密码编码器
Spring Security 的 Servlet 支持包括通过与 PasswordEncoder 集成来安全地存储密码。您可以通过暴露一个 PasswordEncoder Bean 来自定义 Spring Security 使用的 PasswordEncoder 实现。
📄️ DaoAuthenticationProvider
DaoAuthenticationProvider 是一种 AuthenticationProvider 实现,它使用 UserDetailsService 和 PasswordEncoder 来验证用户名和密码。
📄️ LDAP
LDAP(轻量级目录访问协议)常被组织用作用户信息的中央存储库和身份验证服务。它也可用于存储应用程序用户的角色信息。