Spring security有一个基类,代表经过身份验证的用户(“abcde”
):
对UserDetailsService检索的核心用户信息进行建模。
开发人员可以直接使用此类,将其子类化或编写它们 从头开始实现UserDetails。
在互联网上的大多数示例中,例如here人们通常会为持久性创建单独的类,即示例中的org.springframework.security.core.userdetails.User
。
这个类没有扩展spring安全性,所以现在我们有两个用户,一个用于持久性,一个用于表示系统中经过身份验证的用户,我们所做的一切都是:
所以,我的问题是,还有一个用户对象是什么意思?扩展Spring安全性用户并坚持使用它会不会更好? hibernate / jpa注释可能无法实现,因为我们显然无法在spring安全代码中添加注释,但是通过映射文件可以实现。另一个问题是我们不应该从服务中返回hibernate实体以避免服务层之外的所有类型的hibernate相关问题,所以如果我扩展spring user并使其成为一个实体,我无论如何都需要某种类型的POJO从com.mkyong.users.model.User
返回。这就是我们需要两个用户对象的原因吗?
P.S。赞赏文献参考
答案 0 :(得分:2)
主要原因是:
UserDetails
旨在公开与Spring Security相关的经过身份验证的用户的特定信息。这是一个可以在任何版本中根据项目需求进行更改的类。
通过扩展该类并允许持久性模型基于它,您现在可以强制您的持久性模型在任何时候都被这些更改作为人质。你不可避免地违反了这两个原则。
使用单独的持久性类的好处是,您现在可以自由地将安全属性存储在适合您的应用程序需求和目标的任何数据模型中。此外,您的数据库架构不再受您无法控制的外部更改的约束。
这正是Spring Security公开UserDetailsService
的原因。该服务接口旨在允许Spring Security调用特定的存储库实现,并将持久性模型转换为其框架所需的UserDetails
实现,而不违反上述两个原则。