Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证

Spring Security + JPA - Use many business models (entities) for User authentication

我将 Spring BootSpring SecuritySpring Data JPA 一起使用。 我有一个用于身份验证的 User 实体。我还有一个服务扩展 UserDetailsService 并已在我的 SecurityConfiguration 中注册它。

现在我想要的是使用其他两个实体,例如 EmployerEmployee,它们将成为我的业务模型。每个实体都有自己不同的属性(Employer 和 Employee 实体只是一个例子,也可以是其他东西)。我想使用这两个实体进行身份验证,这意味着用户可以注册为员工,除了提供 User 的属性(电子邮件、密码...) Employee 的属性(性别、hire_date ...).

我不知道什么是正确的方法。最佳做法是什么?一个例子将不胜感激。

这是我的用户 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)- 用户