问题描述
我正在将Spring Boot
与Spring Security
和Spring Data JPA
。
我有一个用于身份验证的User
实体。
我还有一个扩展UserDetailsService
的服务,并已在我的SecurityConfiguration中注册了它。
现在,我想要使用另外两个实体,例如Employer
和Employee
,这将是我的业务模型。
每个实体都有其自己的不同属性(“雇主”和“雇员”实体只是一个示例,可能还有其他用途)。
我想同时使用这两个实体进行身份验证,这意味着用户可以提供Employee
的属性(gender,hire_date ...)之外的User
属性(电子邮件,密码...)来注册为Employee。
我应该扩展当前使用的
User
类吗? 这将如何运作?我应该创建两个实体,然后将它们与User实体一对一地关联吗?
还有另一种方法吗?
我不知道什么是正确的方法。 最佳做法是什么? 一个例子将不胜感激。
这是我的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和电子邮件,这是必填且唯一的)使用不同的Entity,该User
与此Authentication
1:1关系。
因此,我们设法扩展了User
并在域中对特定表示进行建模。
如果要创建另一种进行身份验证的方法,则采用相同的方法。
你可以做抽象的Authentication
和后来TokenAuthentication
(例如用于OAuth的)或BasicAuthentication
(用户名和密码)。
我见过的最好的方法之一是3个实体的聚合:
- 抽象身份验证-扩展以提供特定的身份验证方式(令牌,登录名:通过)
- 委托人-存储授权和安全性所需的其他数据(授权,..)
- 抽象用户-扩展域中用户的特定数据(电子邮件,姓名,姓氏...)
关系:身份验证-(N:1)-主体-(1:1)-用户