Database 带附加层的RBAC

Database 带附加层的RBAC,database,design-patterns,yii,rbac,Database,Design Patterns,Yii,Rbac,我正在尝试为RBAC设计一个扭曲的数据库(或者可能只有我认为这是扭曲的?)。据我所知,RBAC使用角色和权限授予/拒绝对系统中某些对象的访问。当我只有一个站点实例,只需创建一个角色“主管理员””、“辅助管理员””、“用户””等,一切都很好、清晰 但是,如果我在系统中有帐户怎么办?所以我有一个系统,上面有“London”、“Tokyo”和“Moscow”账户。现在,我将有'主管理员'为每个帐户,以及许多'用户'在每个帐户-当然莫斯科的家伙不应该能够登录到伦敦帐户。我该怎么做?我是否要创建一些附加表

我正在尝试为
RBAC
设计一个扭曲的数据库(或者可能只有我认为这是扭曲的?)。据我所知,
RBAC
使用角色和权限授予/拒绝对系统中某些对象的访问。当我只有一个站点实例,只需创建一个角色“
主管理员”
”、“
辅助管理员”
”、“
用户”
”等,一切都很好、清晰

但是,如果我在系统中有帐户怎么办?所以我有一个系统,上面有“
London
”、“
Tokyo
”和“
Moscow
”账户。现在,我将有'主管理员'为每个帐户,以及许多'用户'在每个帐户-当然莫斯科的家伙不应该能够登录到伦敦帐户。我该怎么做?我是否要创建一些附加表,将分配绑定到帐户和用户?还是将accountid添加到分配表?或者我应该创建多个角色,如“莫斯科主行政”、“伦敦主行政”等。对于这种情况,最好的方法是什么

此外,我相信我会有一些用户谁是'主管理员'为伦敦帐户和'二级管理员'为东京帐户

我计划使用Yii,它内置于RBAC。。。如果这有什么区别的话

如何应对

提前谢谢你

您可以保留“管理员”角色和规则,因为您已经使用了它们。并为每个城市“莫斯科”、“伦敦”等添加新角色。。。。在控制器中,在动作方法中调用checkAccess,如以下示例所示

public function actionEditArticle($town)
{
 if(!Yii::app()->user->checkAccess($town)
  Yii::app()->end();

 // ... more code
}
更高级的方法是在组件目录中扩展CController,并重写
runAction($action)
方法

public function runAction($action)
{
    if (isset($_GET['town']) {
        if(!Yii::app()->user->checkAccess($_GET['town']) Yii::app()->end();
    }
    parent::runAction($action);
}

根据我对你问题的理解,有两种方法可以解决你的问题

第一种是通过使用分层角色(角色继承)。尽管实施和管理起来更加复杂,但这可以提供一种非常有趣的灵活性

第二种方法是(如果可能感兴趣的话),这是我出于学术原因尝试“扩展”RBAC时尝试过的方法

我所做的是允许为每个角色定义两个或多个“命名”级别。因此,给定一个程序员角色,我的实现允许为角色添加级别,例如:

程序员,级别定义:

  • “高级”=500级
  • “中级”=200级
  • “初级”=0级
  • 因此,当有人对某个对象的实例(如规范文档)分配权限时,可以通过以下方式分配权限:

    “某些文档”->程序员(300级)->可以编辑 “某些文档”->程序员(0级)->可以读取 “某些文档”->程序员(500级)->可以删除

    这表明所有程序员都可以阅读文档,但由于缺乏“级别”权限,不允许初级和中级人员编辑此类文档。只有高级程序员才能删除该文档

    这使得我可以通过只创建一个角色来拥有3个不同级别的权限。在传统系统中,我必须创建三个不同的角色(4个带有继承),例如:

    在非分层实现中:

  • 高级程序员
  • 中级程序员
  • 初级程序员
  • 在分层实现中:

  • 编程器
  • 高级程序员(扩展程序员)
  • 中级程序员(扩展程序员)
  • 初级程序员(扩展程序员)

  • 显然,级别需要适当地定义为子角色。将级别定义为“分析师”是无效的,因为这是两个不同的角色,而不是子类型。

    最适合您的需求是创建组和组层次结构。将角色分配给将间接分配给其所有子组的组。通过这种方式,您可以将公共角色分配给父组,将单个角色分配给单个组。所以,在你的例子中,伦敦、东京和莫斯科是团体

    我通过安全访问控制工具VisualGuard实现了这个解决方案,VisualGuard已经实现并涵盖了大多数应用程序安全问题

    我曾使用VisualGuard对多租户和saas应用程序进行访问控制,其中我广泛使用了组


    阅读更多信息。

    RBAC中的一个长期问题。将上下文添加到决策中(例如帐户)会导致角色爆炸。我写了一篇文章,描述了这个问题,以及角色约束如何解决这个问题


    同样的问题,我认为这个解决方案是误用了角色概念!在上面的例子中,根据RBAC的定义,“莫斯科”似乎是一个许可而不是一个角色;因为我们不应该检查角色来决定操作,而应该检查权限。