Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证
Spring Security + JPA - Use many business models (entities) for User authentication
我将 Spring Boot
与 Spring Security
和 Spring Data JPA
一起使用。
我有一个用于身份验证的 User
实体。我还有一个服务扩展 UserDetailsService
并已在我的 SecurityConfiguration 中注册它。
现在我想要的是使用其他两个实体,例如 Employer
和 Employee
,它们将成为我的业务模型。每个实体都有自己不同的属性(Employer 和 Employee 实体只是一个例子,也可以是其他东西)。我想使用这两个实体进行身份验证,这意味着用户可以注册为员工,除了提供 User
的属性(电子邮件、密码...) Employee
的属性(性别、hire_date ...).
我应该扩展我目前使用的 User
class 吗?这将如何工作?
我是否应该创建这两个实体,然后将它们与用户实体建立一对一的关系?
还有别的方法吗?
我不知道什么是正确的方法。最佳做法是什么?一个例子将不胜感激。
这是我的用户 class:
@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 个或更多业务模型(实体)进行用户身份验证。就这些了。
我的系统也有类似的困境。我们选择仅针对安全模型(用户名、密码、权限等)和抽象 User
(带有 id 和电子邮件 - 这是必需且唯一的)使用不同的实体,它与 1:1 关系这个Authentication
。因此,我们设法扩展了 User
并在域中对特定表示进行了建模。如果您想创建另一种进行身份验证的方式,则采用相同的方式。您可以执行摘要 Authentication
和稍后的 TokenAuthentication
(OAuth 示例)或 BasicAuthentication
(使用用户名和密码)。
我见过的最好的方法之一是聚合 3 个实体:
- 抽象身份验证 - 扩展以提供特定的身份验证方式(令牌,login:pass)
- Principal - 存储权限和其他安全所需的数据(authorites,..)
- 抽象用户 - 扩展域中用户的特定数据(电子邮件、姓名、姓氏...)
关系:身份验证 -(N:1)- 主体 -(1:1)- 用户
我将 Spring Boot
与 Spring Security
和 Spring Data JPA
一起使用。
我有一个用于身份验证的 User
实体。我还有一个服务扩展 UserDetailsService
并已在我的 SecurityConfiguration 中注册它。
现在我想要的是使用其他两个实体,例如 Employer
和 Employee
,它们将成为我的业务模型。每个实体都有自己不同的属性(Employer 和 Employee 实体只是一个例子,也可以是其他东西)。我想使用这两个实体进行身份验证,这意味着用户可以注册为员工,除了提供 User
的属性(电子邮件、密码...) Employee
的属性(性别、hire_date ...).
我应该扩展我目前使用的
User
class 吗?这将如何工作?我是否应该创建这两个实体,然后将它们与用户实体建立一对一的关系?
还有别的方法吗?
我不知道什么是正确的方法。最佳做法是什么?一个例子将不胜感激。
这是我的用户 class:
@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 个或更多业务模型(实体)进行用户身份验证。就这些了。
我的系统也有类似的困境。我们选择仅针对安全模型(用户名、密码、权限等)和抽象 User
(带有 id 和电子邮件 - 这是必需且唯一的)使用不同的实体,它与 1:1 关系这个Authentication
。因此,我们设法扩展了 User
并在域中对特定表示进行了建模。如果您想创建另一种进行身份验证的方式,则采用相同的方式。您可以执行摘要 Authentication
和稍后的 TokenAuthentication
(OAuth 示例)或 BasicAuthentication
(使用用户名和密码)。
我见过的最好的方法之一是聚合 3 个实体:
- 抽象身份验证 - 扩展以提供特定的身份验证方式(令牌,login:pass)
- Principal - 存储权限和其他安全所需的数据(authorites,..)
- 抽象用户 - 扩展域中用户的特定数据(电子邮件、姓名、姓氏...)
关系:身份验证 -(N:1)- 主体 -(1:1)- 用户