多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
上面代码片段中要注意的另一个项目是您可以从`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`会更有意义。