[英]Default value for user role - Spring security
我正在嘗試在用戶在Spring Security中注冊時添加默認角色值。
我有兩個模型“ User”和“ Role”,它們之間存在多對多關系。
User.java
@NotEmpty
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Role> roles = new HashSet<>();
角色.java
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(length=15, unique=true, nullable=false)
private String role = RoleType.USER.getRole();
data.sql
INSERT INTO ROLE(role) VALUES ('USER');
INSERT INTO USER(email,password) VALUES ('user@mail.com','user');
INSERT INTO USER_ROLES(user_id, roles_id) VALUES (1,1);
這里的想法是使用role_id來設置用戶角色,但是我寧願使用String來簡化操作。 這樣一兩行
INSERT INTO USER_ROLES(user_id, roles) VALUES (1, "ADMIN");
INSERT INTO USER_ROLES(user_id, roles) VALUES (1, "DBA");
另外,當我嘗試從JAVA創建用戶時,我需要使用角色dao來檢索相應的ID,並且我想默認將新用戶設置為“ ROLE_USER”。
UserDBTest.java
@Before
public void setUp() {
User user = new User();
user.setEmail("email@mail.com");
user.setPassword("password");
user.addRole(roleRepository.findOne(1L)); //detached entity passed to persist
user = userRepository.save(user);
}
您可以這樣編寫SQL:
INSERT INTO USER_ROLES(user_id, roles)
VALUES (1, (SELECT id FROM roles WHERE role='ADMIN'));
您遇到的JPA錯誤是因為您沒有在事務中運行。 例如,如果使用TestNG ,則可以讓您的測試類擴展AbstractTransactionalTestNGSpringContextTests
,它將起作用。
更新:如果需要額外的數據庫查找,可以選擇將角色名稱直接存儲在USER_ROLES
表中,然后User.java如下所示:
@ElementCollection
@Enumerated(EnumType.STRING)
private Set<RoleType> roles;
如果要將Role
存儲為字符串,則可以將其表示為Java中的枚舉,然后將其完全刪除。 然后,您可以將User
和UserRole
之間的關系表示為@OneToMany
。
在UserRole.java
@ManyToOne
@JoinColumn(name = "user_id")
User user;
@Column(name = "role")
@Enumerated(EnumType.STRING) // this tells JPA to store enum name in db
Role role; //role enum
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.