spring安全数据模型
我目前正在使用spring安全库,我问自己以下问题:我应该如何将我的数据库模型与spring安全表结合起来 正如您所知,spring安全性需要两个表(用户和权限)来定义数据库中的身份验证管理器。从我的pov来看,现在有两种可能性可以存储我的附加用户信息(如电子邮件、姓氏、上次登录等)spring安全数据模型,spring,authentication,spring-security,datamodel,Spring,Authentication,Spring Security,Datamodel,我目前正在使用spring安全库,我问自己以下问题:我应该如何将我的数据库模型与spring安全表结合起来 正如您所知,spring安全性需要两个表(用户和权限)来定义数据库中的身份验证管理器。从我的pov来看,现在有两种可能性可以存储我的附加用户信息(如电子邮件、姓氏、上次登录等) 我可以有一个用于身份验证的普通用户表,另一个用于其余的用户表(通过用户名链接) 我使用必要的属性扩展了spring security的用户表 从你的角度来看,什么是最好的设计?你的经历是什么 Lomu我创建了一个P
Lomu我创建了一个POJO
User
,它代表了Spring安全库所设想的用户实体,其次我创建了一个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
}
@实体
@表(name=“USERS”)
@继承(策略=InheritanceType.JOINED)
公共类用户实现UserDetails{
私有静态最终长serialVersionUID=1L;
私人长id;
私有字符串用户名;
私有字符串密码;
私有布尔启用=真;
Set authorities=new HashSet();
//…接受者和接受者
}
@实体
@表(name=“PROFILED_用户”)
公共类ProfiledUser扩展了用户{
私有静态最终长serialVersionUID=1L;
//一些自定义属性
个人资料;
私人联系人数据联系人数据;
专用地址数据地址数据;
//…接受者和接受者
}
如果您只需要表示一种类型的用户,我认为应该向
user
类添加属性。但是,我更喜欢将Spring安全框架定义的用户抽象概念与业务逻辑分开。因此,我建议您实现自己的SomethingUser
并扩展User
类。人就是人,您应该有一个代表人的类/表†
用户是一个用户,与人不同(因此是两个不同的词),您应该有一个表示用户的类/表
一个人可以没有用户而存在吗?对
没有人的用户能生存吗?不,用户名属于某人
@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;
}
@实体
抽象阶级政党{
@身份证
长id;
字符串名;
@独身癖
List usernames=new ArrayList();
}
@实体
阶级个人延伸党{
出生日期时间;
}
@实体
类用户{
@许多酮
政党;
字符串用户名;
字符串密码;//最好使用BCrypt/Blowfish哈希!
布尔启用=真;
}
如果每一方只需要一个用户名,则可以使用@OneToOne关系
†实际上,您应该有一个更抽象的类/表来代表一个合法当事人。我创建了派生类来代表不同类型的用户。例如,
ProfiledUser扩展了User
。您是否在hibernate中为此创建了一个“User”pojo和一个ProfiledUser pojo?我需要更多的空间,所以我发布了我的答案。