Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证
Posted
技术标签:
【中文标题】Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证【英文标题】:Spring Security + JPA - Use many business models (entities) for User authentication 【发布时间】:2015-10-16 01:46:26 【问题描述】:我将Spring Boot
与Spring Security
和Spring Data JPA
一起使用。
我有一个用于身份验证的User
实体。我还有一个扩展 UserDetailsService
的服务,并在我的 SecurityConfiguration 中注册了它。
现在我想要的是使用另外两个实体,例如 Employer
和 Employee
,这将是我的商业模式。每个实体都有自己不同的属性(Employer 和 Employee 实体只是一个例子,可能是别的)。我想使用这两个实体进行身份验证,这意味着用户可以注册为员工,除了User
的属性(电子邮件、密码......)之外,Employee
的属性(性别、雇用日期......) .
我应该扩展我当前使用的User
类吗?这将如何运作?
是否应该创建这两个实体,然后将它们与用户实体以一对一的关系关联起来?
还有其他方法吗?
我不知道什么是正确的方法。最佳实践是什么?一个例子将不胜感激。
这是我的用户类:
@Entity
@Table(name = "users")
public class User implements Serializable
@Id
@GeneratedValue
private Long id;
@Column(nullable = false, unique = true)
public String email;
@Column(nullable = false)
public String firstname;
@Column(nullable = false)
public String lastname;
@JsonIgnore
@Column(nullable = false)
public String password;
@Column(nullable = false)
@Enumerated(EnumType.STRING)
private Role role;
public User()
public User(User user)
this.email = user.email;
this.firstname = user.firstname;
this.lastname = user.lastname;
this.password = user.password;
this.role = user.role;
public String getEmail()
return email;
public void setEmail(String email)
this.email = email;
public Role getRole()
return role;
public void setRole(Role role)
this.role = role;
public String getFirstname()
return firstname;
public void setFirstname(String firstname)
this.firstname = firstname;
public Long getId()
return id;
public void setId(Long id)
this.id = id;
public String getLastname()
return lastname;
public void setLastname(String lastname)
this.lastname = lastname;
@JsonIgnore
public String getPassword()
return password;
@JsonProperty
public void setPassword(String password)
this.password = password;
编辑:由于还没有人回答,我想也许我解释错了。我只想使用 2 个或更多业务模型(实体)进行用户身份验证。就是这样。
【问题讨论】:
所有方法都应该有效。因此,我认为您应该根据您的业务用例来选择您的域模型。 【参考方案1】:我的系统也有类似的困境。我们选择使用不同的实体仅用于安全模型(用户名、密码、权限等)和抽象 User
(带有 id 和电子邮件 - 这是强制性和唯一的),它与 Authentication
具有 1:1 的关系.所以我们设法扩展了User
并在域中对特定的表示进行建模。如果您想创建另一种进行身份验证的方式,则采用相同的方式。您可以抽象 Authentication
和更高版本的 TokenAuthentication
(OAuth 示例)或 BasicAuthentication
(使用用户名和密码)。
我见过的最好的方法之一是聚合 3 个实体:
抽象身份验证 - 扩展以提供特定的身份验证方式(令牌、登录:通过) 主体 - 存储权限和安全所需的其他数据(权限,..) abstract User - 扩展域中用户的特定数据(电子邮件、姓名、姓氏...)关系:身份验证 -(N:1)- 主体 -(1:1)- 用户
【讨论】:
以上是关于Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security JDBC 和 Hibernate JPA
Spring Security 3.1 + JPA - 空指针异常
实现 Spring Security UserDetails 的 JPA 实体的含义是啥?