2

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

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

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

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

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

洛木

4

2 回答 2

2

我创建了一个 POJO User,它代表 Spring Security 库所设想的 User 实体,其次,我创建了一个 POJOProfiledUser来代表我的应用程序的一种特殊类型的用户。它被称为 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类。

于 2013-07-23T07:17:07.017 回答
0

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

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

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

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

@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-07-24T19:59:59.953 回答