我正试图为RBAC
设计一个扭曲的数据库(或者也许是我唯一认为它扭曲的人?)。据我所知RBAC
使用角色和权限来授予/拒绝对我系统中某些对象的访问权限。当我只有一个网站实例并只创建一个“Main admin
”,“Secondary admin
”,“User
”等角色时,一切都很清晰。
但是,如果我在系统内有帐户怎么办?所以我有一个系统说“London
”,“Tokyo
”和“Moscow
”帐户。现在我将为每个帐户设置“主要管理员”,以及每个帐户中的许多“用户” - 当然莫斯科人不应该能够登录伦敦帐户。我该怎么做?我是否创建了一些附加表来将帐户的分配绑定到用户?或者我将accountid添加到作业表?或许我应该创建多个角色,比如'moscow_main_admin','london_main_admin'等。对于这种情况,最好的方法是什么?
另外我相信我会有一些用户是伦敦帐户的“主要管理员”和东京帐户的“辅助管理员”。
我计划使用Yii,它内置RBAC ......如果这有任何区别。
如何解决?
提前谢谢!
答案 0 :(得分:1)
您可以保留“admin”角色和规则,因为您已经使用过它们。并为每个城镇“莫斯科”,“伦敦”等添加一个新角色....在您的控制器中,在您的操作方法中调用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);
}
答案 1 :(得分:0)
根据我对您的问题的理解,可以有两种方法来解决您的问题。
第一种是使用分层角色(角色继承)。虽然实施和管理更复杂,但这可以提供非常有趣的灵活性。
第二种方式(如果它可能是有意义的)是我在尝试"延伸"时尝试过的。 RBAC出于学术原因。
我所做的是允许定义两个或更多的名字"每个角色的级别。因此,给定一个程序员角色,我的实现允许为角色添加级别,例如:
程序员,级别定义:
因此,当某人为某个对象实例(如规范文档)分配权限时,可以按以下方式分配:
"一些文件" - >程序员(等级300) - >可以编辑 "一些文件" - >程序员(0级) - >可以阅读 "一些文件" - >程序员(500级) - >可以删除
这表明所有程序员都可以阅读该文档,但是不允许青少年和中间人编辑此类文档,因为缺少" level"权威。只有高级程序员才能删除该文档。
这允许我通过仅创建单个角色来拥有3个不同级别的权限。在传统系统中,我将不得不创建三个不同的角色(4个具有继承),例如:
在非分层实现中:
在分层实施中:
显然,需要将级别正确定义为子角色。将等级定义为"分析师"因为这是两个不同的角色而不是子类型,所以不会有效。
答案 2 :(得分:0)
最适合您的要求是创建组和组层次结构。将角色分配给将间接分配给其所有子组的组。通过这种方式,您可以将父级组和个人角色的共同角色分配给单个组。所以,在你的情况下,伦敦,东京和莫斯科都是团体。
我通过安全访问控制工具Visual Guard实现了这个解决方案,它已经实现并涵盖了大多数应用程序安全问题。
我使用Visual guard访问多租户和saas应用程序的控件,其中我广泛使用了组。
Click here阅读更多内容。
答案 3 :(得分:0)
RBAC中一个长期存在的问题。在决策中添加上下文,例如帐户,导致角色爆炸。这是我写的一篇文章,描述了问题以及角色约束如何解决问题。
https://iamfortress.net/2018/07/07/towards-an-attribute-based-role-based-access-control-system/