如何为多用户 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 用户设置角色?

如何为 GitHub 组织添加自定义用户角色?

如何为我的场景实现单点登录?

Pentaho/Mondrian:如何为登录用户设置“动态角色”?

如何为 Spring Security 创建类型安全的用户角色?

Mongo - 如何找出我连接的用户的角色?如何为用户分配完全读写访问权限?