Oop 在RBAC中向用户授予特殊权限

Oop 在RBAC中向用户授予特殊权限,oop,security,design-patterns,architecture,roles,Oop,Security,Design Patterns,Architecture,Roles,我在企业软件中使用基于角色的访问控制进行授权。我创建了三个类:User、Role和Privilege。用户与角色有多对多关系,角色与权限有多对多关系。客户的要求之一是向特定用户添加特权。例如,用户u有一个名为r的角色,据此,u只能调用foo服务。但是我想添加特权p,这样他也可以调用bar服务,即使他的角色不允许他调用bar。 我想到的唯一解决方案是,用户和特权也有多对多的关系。但是我认为这不是一个好主意。如果在用户和特权之间创建多对多关系不利于您正在创建的系统,那么您可以为特权创建一个一次性角色

我在企业软件中使用基于角色的访问控制进行授权。我创建了三个类:
User
Role
Privilege
。用户与角色有多对多关系,角色与权限有多对多关系。客户的要求之一是向特定用户添加特权。例如,用户
u
有一个名为
r
的角色,据此,
u
只能调用
foo
服务。但是我想添加特权
p
,这样他也可以调用
bar
服务,即使他的角色不允许他调用
bar

我想到的唯一解决方案是,用户和特权也有多对多的关系。但是我认为这不是一个好主意。

如果在用户和特权之间创建多对多关系不利于您正在创建的系统,那么您可以为特权创建一个一次性角色。例如,如果用户
u
通过
rn
拥有角色
r0
,这些角色通过
pn
拥有特权
p0
,其中没有一个具有访问资源的权限,
res1
,那么您可以创建一个特殊角色
rs
,允许访问
res1
并将该角色分配给
u

因此,创建特权的算法是:

  • 创建有权访问所需资源的特权,
    p
  • 创建角色,
    r
    ,并为其分配
    p
  • r
    分配给用户
    u
  • 使用此方案,用户
    u
    现在将能够通过
    pn
    访问
    p0
    允许的所有资源,以及步骤(1)中创建的
    p
    可访问的资源


    如果许多用户需要这些特权(即,许多用户需要对同一资源进行特殊访问),则可以重用该角色。例如,根据需要,可以为每个所需资源创建一个新角色(上述算法中的步骤(2)),并且可以将该角色分配给多个用户。如果不需要重用,则可以在每次需要特权时创建新角色和特权。后一种情况(不可重复使用)的优点是比前一种更简单。

    谢谢,这似乎是个好主意。我还有一个要求,不知你能否帮我。有时,客户需要为用户禁用某个特权,即使他的角色允许他访问该特权。如何使用当前结构实现此目的?@narimanesmaielyford您可以向用户添加禁用权限列表。遍历角色和权限树后,将删除该用户的禁用列表中的权限,并保留当前为该用户启用的权限。