当前位置: 代码迷 >> java >> Spring Security + JPA-使用许多业务模型(实体)进行用户身份验证
  详细解决方案

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

热度:36   发布时间:2023-07-16 17:37:36.0

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

现在,我想要使用另外两个实体,例如EmployerEmployee ,这将是我的业务模型。 每个实体都有其自己的不同属性(“雇主”和“雇员”实体只是一个示例,可能还有其他用途)。 我想同时使用这两个实体进行身份验证,这意味着用户可以提供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个或多个业务模型(实体)进行用户身份验证。 就这样。

我的系统中有类似的难题。 我们选择仅对安全模型(用户名,密码,授权机构等)和抽象User (具有ID和电子邮件,这是必填且唯一的)使用不同的Entity,该User与此Authentication 1:1关系。 因此,我们设法扩展了User并在域中对特定表示进行建模。 如果要创建另一种进行身份验证的方法,则采用相同的方法。 你可以做抽象的Authentication和后来TokenAuthentication (例如用于OAuth的)或BasicAuthentication (用户名和密码)。

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

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

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

  相关解决方案