开发者社区 问答 正文

Cassandra中的用户角色权限数据模型怎么设计?

我必须设计一个用户角色权限控制系统,其中: -

1)一旦用户注册他自己,他将拥有所有权限,但如果他将注册另一个用户在某个许可下发送的电子邮件邀请,那么他将只能访问已经获得许可的那些部分。

2)角色有权限。

3)角色可以拥有多个用户/权限。

4)一旦给予用户角色,他将能够访问在该角色中给出的那些权限。

5)但是如果为用户分配了NoRole,那么我们可以给他们一定的权限。

6)可以向用户提供具有所有访问权限的默认角色Super_Admin。

7)用户创建另一个用户并且只能提供他拥有的那些权限。

查询是: -

1)获取所有用户。

2)获得所有角色。

3)获取特定角色的权限/用户。

4)获取用户的权限。

*我怀疑如何处理多对多的关系,因为许多用户可以拥有多个角色,而且许多角色可以拥有许多权限。

*我也怀疑是否给用户一个角色然后角色的权限可以给用户但是如果有NoRole那么我们必须直接向用户分配权限如何处理这意味着如何创建表到处理这个(事情。

还有三种类型的用户1)管理员2)SuperAdmin 3)普通用户。SuperAdmin可以创建另一个superadmin,可以删除普通用户等.Admin可以创建角色添加用户。

谢谢。

展开
收起
被纵养的懒猫 2019-09-17 17:24:59 794 分享 版权
阿里云 AI 助理回答

设计这样一个用户角色权限控制系统,确实需要处理多对多的关系。在关系型数据库中,通常通过创建关联表来管理这种复杂的关系。以下是一个基于你需求的数据库表结构设计方案:

  1. users (用户表)

    • user_id (用户ID, 主键)
    • username (用户名)
    • email (邮箱)
    • role_id (角色ID, 外键,可以为NULL表示NoRole)
  2. roles (角色表)

    • role_id (角色ID, 主键)
    • role_name (角色名称: 如 'Admin', 'Super_Admin', 'Normal_User')
  3. permissions (权限表)

    • permission_id (权限ID, 主键)
    • permission_name (权限名称: 如 'Read', 'Write', 'Delete')
  4. role_permissions (角色-权限关联表)

    • role_permission_id (自增ID, 主键)
    • role_id (角色ID, 外键)
    • permission_id (权限ID, 外键)
  5. user_roles (用户-角色关联表) 用于处理用户可能有多个角色的情况

    • user_role_id (自增ID, 主键)
    • user_id (用户ID, 外键)
    • role_id (角色ID, 外键)
  6. user_direct_permissions (用户直接权限表) 用于处理NoRole用户直接分配的权限

    • user_permission_id (自增ID, 主键)
    • user_id (用户ID, 外键)
    • permission_id (权限ID, 外键)

根据这个设计,你可以回答你的查询问题:

  1. 获取所有用户:

    SELECT * FROM users;
    
  2. 获得所有角色:

    SELECT * FROM roles;
    
  3. 获取特定角色的权限/用户:

    • 获取角色的权限:
      SELECT p.permission_name 
      FROM permissions p 
      JOIN role_permissions rp ON p.permission_id = rp.permission_id 
      WHERE rp.role_id = ?; -- 替换?为具体的角色ID
      
    • 获取角色的用户:
      SELECT u.username 
      FROM users u 
      JOIN user_roles ur ON u.user_id = ur.user_id 
      WHERE ur.role_id = ?; -- 替换?为具体的角色ID
      
  4. 获取用户的权限: 用户的权限来自两个地方:通过角色间接获得和直接赋予的。

    SELECT p.permission_name 
    FROM permissions p 
    -- 通过角色获得的权限
    JOIN role_permissions rp ON p.permission_id = rp.permission_id 
    JOIN user_roles ur ON rp.role_id = ur.role_id AND ur.user_id = ?
    UNION
    -- 直接赋予的权限
    SELECT p.permission_name 
    FROM permissions p 
    JOIN user_direct_permissions udp ON p.permission_id = udp.permission_id 
    WHERE udp.user_id = ?; -- 替换两个?为具体的用户ID
    

这样的设计允许灵活地处理多对多关系,并且能够满足你提到的所有场景,包括超级管理员、管理员和普通用户的区分,以及不同类型的权限控制。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: