簡體   English   中英

用戶角色的默認值-Spring Security

[英]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中的枚舉,然后將其完全刪除。 然后,您可以將UserUserRole之間的關系表示為@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM