Spring Security 应用程序的用户类

Tim*_*mes 6 java architecture spring spring-security

我目前正在开发一个带有 JPA/Hibernate 和 Angular 2 前端的多用户 Spring Boot 应用程序。我设想了两种基本类型的用户:供应商和客户。

在开始编码之前,我制作了一个 UML 类图,其中包含该类User和两个子类Customer以及Vendor. 子类的原因是它们具有不同的属性:例如,供应商应该能够编写关于他自己的一般描述,而客户应该能够保存收藏夹。

下图是我的类图的摘录:

UML 类图片段

由于这是我的第一个具有登录/注册功能的应用程序,我开始阅读有关如何使用 Spring Security 实现登录和注册功能的教程。随着时间的推移,我不得不意识到基本上所有的样本都只包含一个User类,其权限取决于他的Roles,这通常是实现上述功能的推荐/需要的类。

在我看来,User该类并不意味着有子类,但教程和示例自然主要涵盖基本设置,而不是具有完全不同用户的复杂业务模型的表示。

我的问题如下:创建User我想用于授权自定义UserDetailsService类的类的子类是否可行和可取?如果没有,您是否建议将CustomerVendor类中的属性合并到User类中,从而确定User的角色是否应该能够拥有某个属性,否则它将为空?

非常感谢!

Jwo*_*Ker 8

Spring 安全性与UserDetailsService用于身份验证和授权功能的接口一起工作。您应该实现从数据库或内存或任何地方loadUserByUsername加载的功能User

Spring 安全以UserDetails接口为模型工作。因此,您的User实体需要实现UserDetailsSpring Security 可以使用的接口。

现在,您拥有User可以像其他实体一样继承的实体,并且您可以使用@Inheritance以下注释对其进行注释:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class User implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Length(min=5)
    private String password;
    private String username;

    @Email
    private String email;
    private String phoneNumber;
    private boolean enabled;
    private boolean verified;

    @ManyToMany(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private Set<Authority> roles= new HashSet<>();

    //...
}

@Entity
public class Vendor extends User{
        private String name;
        private String description;
        private Date openingTime;
        private Date closingTime;
        @ManyToOne
        private List<File> images;
        //...
}

@Entity
public class Customer extends User{
        private String forename;
        private String surname;
        @ManyToOne
        private List<PaymentDetails> paymentDetailsList;
        //...
}
Run Code Online (Sandbox Code Playgroud)