【问题标题】:spring security datamodel春季安全数据模型
【发布时间】:2013-07-21 13:49:02
【问题描述】:

我目前正在使用 spring-security 库,我问自己以下问题:我应该如何将我的数据库模型与 spring-security 表结合起来?

如您所知,spring-security 需要两个表(用户和权限)来在数据库中定义身份验证管理器。从我的 pov 来看,我现在有两种可能性来存储我的其他用户信息(如电子邮件、姓氏、上次登录......)

  1. 我可以有一个普通的用户表用于身份验证,另一个用于其余的(由用户名链接)

  2. 我用我必要的属性扩展了 spring-security 的用户表。

从您的角度来看,最好的设计是什么?你有什么经验?

洛穆

【问题讨论】:

  • 我创建了派生类来代表不同类型的用户。例如ProfiledUser extends User
  • 您是否在 hibernate 中为此创建了“用户”pojo 和 ProfiledUser pojo?
  • 我需要更多空间,所以我发布了我的答案。

标签: spring authentication spring-security datamodel


【解决方案1】:

我创建了一个 POJO User,它代表 Spring Security 库所设想的 User 实体,其次,我创建了一个 POJO ProfiledUser 来代表我的应用程序的一种特殊类型的用户。它被称为 ProfiledUser 是因为我需要一个与配置文件关联的用户。当然,类似的方法可以应用于您需要代表的每种类型的用户。基本上,如果你需要不止一种类型的用户,你可以让你的类来扩展用户 POJO。 在下面,您可以找到带有 JPA 注释的类。

@Entity
@Table(name="USERS")
@Inheritance(strategy=InheritanceType.JOINED)
public class User implements UserDetails {

    private static final long serialVersionUID = 1L;
    private long id;
    private String username;
    private String password;
    private boolean enabled = true;
    Set<Authority> authorities = new HashSet<Authority>();  
    //...getters & setters
    }

@Entity
@Table(name="PROFILED_USERS")
public class ProfiledUser extends User{

    private static final long serialVersionUID = 1L;
    //some custom attributes
    private PersonalData personalData;
    private ContactData contactData;
    private AddressData addressData;
    //...getters & setters

    }

如果您只需要代表一种类型的用户,我认为应该向User 类添加属性。但是,我更喜欢将 Spring Security 框架定义的用户抽象概念与我的业务逻辑分开。所以我建议实现你自己的SomethingUser 并扩展User 类。

【讨论】:

    【解决方案2】:

    一个人就是一个人,你应该有一个代表一个人的类/表†。

    用户是用户,与人不同(因此有两个不同的词),您应该有一个代表用户的类/表。

    一个人可以没有用户而存在吗?是的

    用户可以没有人而存在吗?不,用户名属于某人。

    @Entity
    abstract class Party {
    
      @Id
      Long id;
    
      String name;
    
      @OneToMany
      List<User> usernames = new ArrayList<>();
    }
    
    @Entity
    class Individual extends Party {
      DateTime dateOfBirth;
    }
    
    @Entity
    class User {
    
      @ManyToOne
      Party party;
    
      String username;
    
      String password; //you better use BCrypt/Blowfish hashing!
    
      Boolean enabled = true;
    }
    

    如果您只希望每方有一个用户名,则可以改用 @OneToOne 关系。

    † 实际上,您应该有一个代表法律方的更抽象的类/表。

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 2014-02-02
      • 2012-12-13
      • 2017-11-30
      • 2021-05-12
      • 2019-03-31
      • 1970-01-01
      相关资源
      最近更新 更多