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

Chr*_*tis 6 java spring jpa spring-security spring-data-jpa

我正在使用Spring BootSpring SecuritySpring Data JPA我有一个User用于身份验证的实体。我还有一个服务扩展UserDetailsService,并将其注册到我的安全配置中。

现在我想要的是使用另外两个实体EmployerEmployee这将是我的业务模型。每个实体都有自己不同的属性(雇主和雇员实体只是一个示例,可能是其他实体)。我想使用这两个实体进行身份验证,这意味着用户可以注册为员工,提供除了 的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:既然还没人回答,我想也许我解释错了。我只想使用 2 个或更多业务模型(实体)进行用户身份验证。就这样。

Mat*_*ati 1

我的系统中也有类似的困境。我们选择仅对安全模型(用户名、密码、权限等)和摘要(带有 id 和电子邮件 - 这是强制性且唯一的)使用不同的实体User,这与 this 呈 1:1 关系Authentication。因此,我们设法扩展User领域中的特定表示并建模。如果您想创建另一种方式进行身份验证,也可以采用同样的方法。您可以进行摘要Authentication和稍后TokenAuthentication(例如 OAuth)或BasicAuthentication(使用用户名和密码)。

我见过的最好的方法之一是聚合 3 个实体:

  • 抽象身份验证 - 扩展以提供特定的身份验证方式(令牌、登录:通过)
  • 主体 - 存储安全所需的权限和其他数据(权限,..)
  • 抽象用户 - 扩展域中用户的特定数据(电子邮件、姓名、姓氏……)

关系:身份验证 -(N:1)- 主体 -(1:1)- 用户