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

Posted

技术标签:

【中文标题】Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证【英文标题】:Spring Security + JPA - Use many business models (entities) for User authentication 【发布时间】:2015-10-16 01:46:26 【问题描述】:

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

现在我想要的是使用另外两个实体,例如 EmployerEmployee,这将是我的商业模式。每个实体都有自己不同的属性(Employer 和 Employee 实体只是一个例子,可能是别的)。我想使用这两个实体进行身份验证,这意味着用户可以注册为员工,除了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;
    

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

【问题讨论】:

所有方法都应该有效。因此,我认为您应该根据您的业务用例来选择您的域模型。 【参考方案1】:

我的系统也有类似的困境。我们选择使用不同的实体仅用于安全模型(用户名、密码、权限等)和抽象 User(带有 id 和电子邮件 - 这是强制性和唯一的),它与 Authentication 具有 1:1 的关系.所以我们设法扩展了User 并在域中对特定的表示进行建模。如果您想创建另一种进行身份验证的方式,则采用相同的方式。您可以抽象 Authentication 和更高版本的 TokenAuthentication(OAuth 示例)或 BasicAuthentication(使用用户名和密码)。

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

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

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

【讨论】:

以上是关于Spring Security + JPA - 使用许多业务模型(实体)进行用户身份验证的主要内容,如果未能解决你的问题,请参考以下文章

将 Spring Security 与 JPA 结合使用

Spring Security JDBC 和 Hibernate JPA

Spring Security 3.1 + JPA - 空指针异常

实现 Spring Security UserDetails 的 JPA 实体的含义是啥?

Spring Security 3 身份验证与 Hibernate 3(JPA) 注释的集成

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