我目前正在开发一个使用 JPA/Hibernate 和 Angular 2 前端的多用户 Spring Boot 应用程序。我设想了两种基本类型的用户:供应商和客户。
在开始编码之前,我制作了一个 UML 类图,其中包含类 User
以及两个子类 Customer
和 Vendor
。子类的原因是它们具有不同的属性:例如供应商应该能够写出关于自己的一般描述,而客户应该能够保存 Collection 夹。
下图是我的类图的摘录:
由于这是我的第一个具有登录/注册功能的应用程序,我开始阅读有关如何使用 Spring Security 实现登录和注册功能的教程。随着时间的推移,我不得不意识到,基本上所有示例都只包含一个 User
类,其权限由他的 Role
决定,这通常是推荐/需要的类实现上述功能。
在我看来,User
类并不意味着有子类,但教程和示例自然主要涵盖基本设置,而不是具有完全不同用户的复杂业务模型的表示。
我的问题如下:创建我想要用于自定义 UserDetailsService
类授权的 User
类的子类是否可行且明智?如果没有,您是否建议将 Customer
和 Vendor
类中的属性合并到 User
类中,从而确定 User
的角色是否应该能够具有某个属性,否则该属性将为空?
提前非常感谢!
最佳答案
Spring security 使用 UserDetailsService
接口(interface)来实现身份验证和授权功能。您应该实现 loadUserByUsername
函数,以便从数据库、内存或任何位置加载 User
。
Spring 安全性使用 UserDetails
接口(interface)作为模型。因此,您的 User
实体需要实现 Spring Security 可以使用的 UserDetails
接口(interface)。
现在,您拥有可以像其他实体一样继承的 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;
//...
}
关于java - Spring Security 应用程序的用户类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51218227/