坚持 org.springframework.security.core.userdetails.User 或 UserDetails

Vad*_*huk 5 java spring hibernate jpa spring-security

Spring security 有一个基类代表经过身份验证的 User( org.springframework.security.core.userdetails.User):

对 UserDetailsS​​ervice 检索的核心用户信息进行建模。

开发人员可以直接使用这个类、子类化它,或者从头开始编写他们自己的 UserDetails 实现。

在互联网上的大多数示例中,例如这里人们通常为持久性创建单独的类,即com.mkyong.users.model.User在示例中。这个类没有扩展spring security的一个,所以现在我们有两个Users,一个是持久化的,一个代表系统中经过认证的User,我们所做的一切都是:

  1. 通过用户名和密码检索持久性用户
  2. 将字段复制到 spring 用户并返回它

所以,我的问题是,再拥有一个 User 对象有什么意义?扩展 spring security User 并坚持它不是更好吗?使用 hibernate/jpa 注释可能无法实现,因为我们显然不能在 spring 安全代码中放置注释,但是可以通过映射文件来实现。这里的另一个问题是我们不应该从服务中返回休眠实体以避免服务层之外的所有类型的休眠相关问题,所以如果我扩展 spring 用户并使其成为实体,我无论如何都需要某种 POJO从UserDetailsService. 这就是我们需要两个 User 对象的原因吗?

对文档的 Ps 参考表示赞赏

Nar*_*ros 3

主要原因有:

  • 关注点分离
  • 单一责任原则

UserDetails旨在公开有关经过身份验证的用户的特定信息,因为它与 Spring Security 相关。它是一个可以根据任何版本的项目需求进行更改的类。

通过扩展该类并允许您的持久性模型基于它,您现在可以强制您的持久性模型随时受到这些更改的影响。你不可避免地违反了这两个原则。

使用单独的持久性类的好处是,您现在可以自由地将安全属性存储在适合您的应用程序的需求和目标的任何数据模型中。此外,您的数据库模式不再受您无法控制的外部更改的约束。

这正是 Spring Security 公开UserDetailsService. 该服务接口旨在允许 Spring Security 调用特定的存储库实现,并将您的持久性模型转换为其UserDetails框架所需的必要实现,而不会违反上述两个原则。