上面代码片段中要注意的另一个项目是您可以从`Authentication`对象获取主体。 主体只是一个对象。 大多数情况下,这可以转换为`UserDetails`对象。 `UserDetails`是Spring Security中的核心接口。 它代表一个主体,但是以可扩展和特定于应用程序的方式。 将`UserDetails`视为您自己的用户数据库与`SecurityContextHolder`中所需的适配器。 作为来自您自己的用户数据库的东西的表示,通常您会将UserDetails转换为您的应用程序提供的原始对象,因此您可以调用特定于业务的方法(如`getEmail(), getEmployeeNumber()`等)。
到现在为止你可能想知道,所以我什么时候提供UserDetails对象? 我怎么做? 我以为你说这个东西是声明性的,我不需要编写任何Java代码 - 是什么给出的? 简短的回答是有一个名为`UserDetailsService`的特殊接口。 此接口上唯一的方法接受基于`String`的用户名参数并返回`UserDetails`:
~~~
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
~~~
这是在Spring Security中为用户加载信息的最常用方法,你会看到它在整个框架中需要有关用户信息的使用。
在成功进行身份验证后,`UserDetails`用于构建存储在`SecurityContextHolder`中的`Authentication`对象(详见下文)。 好消息是我们提供了许多`UserDetailsService`实现,包括一个使用内存映射(`InMemoryDaoImpl`)和另一个使用JDBC(`JdbcDaoImpl`)的实现。 但是,大多数用户倾向于自己编写,他们的实现通常只是基于代表其 employees, customers,或users 的现有数据访问对象(DAO)之上。 记住,无论你的`UserDetailsService`返回什么,总是可以使用上面的代码片段从`SecurityContextHolder`获得。
>关于`UserDetailsService`经常会有一些混乱。 它纯粹是用户数据的DAO,除了将数据提供给框架内的其他组件之外,不执行任何其他功能。 特别是,它不会对用户进行身份验证,这是由`AuthenticationManager`完成的。 在许多情况下,如果您需要自定义身份验证过程,则直接实现`AuthenticationProvider`会更有意义。
- 架构
- 9.技术概述
- 9.1 运行环境
- 9.2 核心组件
- 9.2.1 SecurityContextHolder, SecurityContext and Authentication Objects
- 9.2.2 The UserDetailsService
- 9.2.3 GrantedAuthority
- 9.2.4 总结
- 9.3 验证
- 9.3.1 在Spring Security中验证是什么
- 9.3.2 直接设置SecurityContextHolder内容
- 9.4 web应用中的验证
- 9.4.1 ExceptionTranslationFilter
- 9.4.2 AuthenticationEntryPoint
- 9.4.3 验证机制
- 9.4.4 在请求之间存储SecurityContext
- 9.5 Spring Security中的访问控制(授权)
- 9.5.1 Security and AOP Advice
- 9.5.2 Secure Objects and the AbstractSecurityInterceptor
- 什么是配置属性
- RunAsManager
- AfterInvocationManager
- 扩展安全对象模型
- 9.6 本地化
- 10 核心服务
- 10.1 The AuthenticationManager, ProviderManager and AuthenticationProvider
- 10.1.1 成功验证时擦除凭据
- 10.1.2 DaoAuthenticationProvider
- 10.2 UserDetailsService实现
- 10.2.1 In-Memory Authentication
- 10.2.2 JdbcDaoImpl
- Authority Groups
- 10.3 Password Encoding
- 10.3.1 密码发展史
- 10.3.2 DelegatingPasswordEncoder
- 密码存储格式
- 密码编码
- 密码比对
- 入门体验
- 排除故障
- 10.3.3 BCryptPasswordEncoder
- 10.3.4 Pbkdf2PasswordEncoder
- 10.3.5 SCryptPasswordEncoder
- 10.3.6 其他PasswordEncoders
- 10.4 Jackson的支持
- 11 测试方法安全
- 12 集成spring mvc测试
- 13 webflux支持
- 14 安全过滤器链
- 14.1 DelegatingFilterProxy
- 14.2 FilterChainProxy
- 14.2.1 绕过过滤链
- 14.3 过滤器顺序
- 14.4 匹配请求和http防火墙
- 14.5 与其他基于过滤器的框架一起使用
- 14.6 Advanced Namespace Configuration
- 15. 核心的安全过滤器
- 15.1 FilterSecurityInterceptor
- 15.2 ExceptionTranslationFilter
- 15.3 SecurityContextPersistenceFilter
- 15.4 UsernamePasswordAuthenticationFilter