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时尝试过的方法 我所做的是允许为每个角色定义两个或多个“命名”级别。因此,给定一个程序员角色,我的实现允许为角色添加级别,例如: 程序员,级别定义:
显然,级别需要适当地定义为子角色。将级别定义为“分析师”是无效的,因为这是两个不同的角色,而不是子类型。最适合您的需求是创建组和组层次结构。将角色分配给将间接分配给其所有子组的组。通过这种方式,您可以将公共角色分配给父组,将单个角色分配给单个组。所以,在你的例子中,伦敦、东京和莫斯科是团体 我通过安全访问控制工具VisualGuard实现了这个解决方案,VisualGuard已经实现并涵盖了大多数应用程序安全问题 我曾使用VisualGuard对多租户和saas应用程序进行访问控制,其中我广泛使用了组
阅读更多信息。RBAC中的一个长期问题。将上下文添加到决策中(例如帐户)会导致角色爆炸。我写了一篇文章,描述了这个问题,以及角色约束如何解决这个问题
同样的问题,我认为这个解决方案是误用了角色概念!在上面的例子中,根据RBAC的定义,“莫斯科”似乎是一个许可而不是一个角色;因为我们不应该检查角色来决定操作,而应该检查权限。