如何为多用户 Java 应用程序设计/保留用户角色(当前和已注册)?
Posted
技术标签:
【中文标题】如何为多用户 Java 应用程序设计/保留用户角色(当前和已注册)?【英文标题】:How to design/persist user roles (current & signed up) for a multi-user java app? 【发布时间】:2019-11-25 19:07:16 【问题描述】:我正在构建一个应用程序,允许每个用户选择是否要注册为玩家,也可以选择注册为管理员。他们可以同时注册为玩家和管理员,但只能拥有一个当前角色 -> 即只能在给定时间以玩家/管理员身份登录。
我正在使用 Player-Role 模式,其中 Player 和 Admin 类 扩展 抽象 UserRole 类。
我应该创建什么样的表结构来支持这一点:
我可以存储用户注册的角色列表 我可以按需存储和检索用户的当前用户角色例如,我希望数据库支持以下代码以在 Player.getRole() 中获取用户的当前角色,并为 Admin.getRole() 获取类似的角色:
User userWithID = User.getUser(userWithID);
UserRole playerRole = null;
List<UserRole> userRoles = userWithID.getRoles();
for(UserRole role : userRoles)
if(role instanceof Player)
playerRole = role;
break;
if(playerRole == null) throw new IllegalAccessError("Player with ID does not exist");
else
return (Player) playerRole;
问题出现了,我需要来自用户角色的两种信息。 1- 注册的角色,以及 2- 当前角色。并且 UserRole 是抽象的。
注意:在将其标记为重复之前: *** 上的所有其他问题都没有指示如何为用户获取当前用户角色的答案,或者没有在此域模型下指定实现。
【问题讨论】:
【参考方案1】:既然你标记了database-design,我将展示一个可能的表格设计:
CREATE TABLE users (
user_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
...
);
CREATE TABLE roles (
role_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
...
);
CREATE TABLE user_has_role (
user_id bigint REFERENCES users NOT NULL,
role_id bigint REFERENCES roles NOT NULL,
PRIMARY KEY (user_id, role_id)
);
CREATE TABLE current_role (
user_id bigint PRIMARY KEY REFERENCES users,
role_id NOT NULL,
FOREIGN KEY (user_id, role_id) REFERENCES user_has_role
);
前三个表包含静态信息,第四个表在用户登录时更新。
【讨论】:
以上是关于如何为多用户 Java 应用程序设计/保留用户角色(当前和已注册)?的主要内容,如果未能解决你的问题,请参考以下文章
IdentityServer4:如何为 Google 用户设置角色?
Pentaho/Mondrian:如何为登录用户设置“动态角色”?