存储机制
每种受支持的读取用户名和密码的机制都可以使用任何一种受支持的存储机制:
-
关系型数据库与JDBC Authentication
-
自定义数据存储与UserDetailsService
-
LDAP 存储与LDAP Authentication
章节摘要
📄️ 内存
Spring Security 的 InMemoryUserDetailsManager 实现了 UserDetailsService,以提供基于用户名/密码的认证支持,这些信息存储在内存中。InMemoryUserDetailsManager 通过实现 UserDetailsManager 接口来管理 UserDetails。当 Spring Security 配置为接受用户名和密码进行认证时,就会使用基于 UserDetails 的认证。
📄️ JDBC
Spring Security 的 JdbcDaoImpl 实现了 UserDetailsService,以提供基于用户名和密码的认证支持,这些信息是通过使用 JDBC 检索的。JdbcUserDetailsManager 扩展了 JdbcDaoImpl,通过 UserDetailsManager 接口提供了对 UserDetails 的管理。当 Spring Security 被配置为接受用户名/密码进行认证时,会使用基于 UserDetails 的认证。
📄️ UserDetails
UserDetails 是由 UserDetailsService 返回的。DaoAuthenticationProvider 会验证 UserDetails,然后返回一个 Authentication,其主体是配置的 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(轻量级目录访问协议)常被组织用作用户信息的中央存储库和认证服务。它也可以用来存储应用程序用户的角色信息。
📄️ 缓存 UserDetails
Spring Security 提供了使用 CachingUserDetailsService 缓存 UserDetails 的支持。或者,你可以使用 Spring Framework 的 @Cacheable 注解。无论哪种情况,你都需要禁用凭证擦除,以便验证从缓存中检索到的密码。