【发布时间】:2022-01-16 21:47:24
【问题描述】:
为了安全起见,我正在尝试在 Spring 应用程序中实现简单的用户角色关系。基本实体(一些字段和注释被修剪):
用户
@Table(name="usr")
public class User implements Serializable {
@Id
private UUID id;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name="user_roles", joinColumns=@JoinColumn(name="user_id", referencedColumnName="id"),
inverseJoinColumns=@JoinColumn(name="role_id", referencedColumnName="id"))
private Collection<Role> roles;
}
角色
public class Role implements Serializable {
@Id
private UUID id;
@ManyToMany(mappedBy="roles")
private Collection<User> users;
private String name;
}
到目前为止,一切都很好。但是,我还有一个定义角色名称值列表的类:
用户角色
public class UserRole {
public static final String ADMIN = "admin";
public static final String USER = "user";
}
我想将Role 的name 字段的值限制为UserRoles 中的值,就像一个枚举一样。
这些role 值将在要求角色为字符串值的 Spring Security 函数中使用。因此,如果我将UserRoles 设为枚举,则任何数据库存储都将是ints——UserRoles 中的序数定义位置——这将迫使我保留任何可能被弃用的选项,并且还需要一个 hacky每次我需要将role 转换为可以在 JWT 等中传递的字符串时都进行转换。(如果我想直接查看我的数据库,它的信息量也会少得多。)
有没有办法将Role 的名称字段定义为仅限于UserRoles 中的静态值? (更改这些值的存储方式或存储位置是完全可以接受的。)
【问题讨论】: