java - Spring Security 应用程序的用户类

标签 java spring spring-security architecture

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

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

下图是我的类图的摘录:

UML class diagram snippet

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

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

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

提前非常感谢!

最佳答案

Spring security 使用 UserDetailsS​​ervice 接口(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/

相关文章:

java - 什么是在浏览器中运行的简单位图编辑器(jquery/java/javascript)?

java - 无法执行目标 org.apache.maven.plugins :maven-compiler-plugin:3. 8.1:编译

java - 如何配置 Spring Security AuthenticationManager 与 JdbcUserDetailsManager 一起使用?

java - JPA ManyToOne 字段未存储

spring - MonitorFilter::WARNING:监控过滤器必须是链中的第一个过滤器

java - 什么是安装 Java EE 应用程序的好的 InstallAnywhere 替代品?

java - 具有巨大字符串响应的 Tomcat 性能

java - 如何消除 Eureka Dashboard 上的 "Eureka may be incorrectly claiming instances are up when they' re not”警告?

xml - 无法解析匹配的构造函数(提示 : specify index/type/name arguments for simple parameters to avoid type ambiguities)

authentication - Spring 安全: adding "On successful login event listener"