用户角色的默认值 - Spring security

时间:2016-02-15 09:23:00

标签: java sql spring spring-security

当用户在Spring Security中注册时,我正在尝试添加默认角色值。

我有两个模型“用户”和“角色”与多对多关系相关联。

User.java

@NotEmpty
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Role> roles = new HashSet<>();

Role.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来实现lisibility。像这样的一行或两行

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);
}

2 个答案:

答案 0 :(得分:1)

您可以像这样编写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;

答案 1 :(得分:0)

如果要将Role存储为字符串,则可以将其表示为Java中的枚举,并完全删除该表。 然后,您可以在@OneToManyUser之间将关系表示为UserRole

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