我们目前正在中为设计一个web应用程序(ASP.NET)中的用户角色和权限系统,并且似乎有几个案例表明不适合于经典的基于角色的访问控制(RBAC)中的。我将发表几个问题,每一个专门针对一个特定的案例,这是第一篇文章。
我们有以下案例:如果用户居住在特定城市,则不允许用户查看特定页面。这是一个简单的情况,其编码方式如下:
if (User.City == “Moscow”)
// Allow the user to view the page.
else
// Do not allow the user to view this page.
虽然这个例子非常简单和简单,但它与RBAC无关。
在StackOverflow上,有人称它为基于属性的访问控制.
在经典的RBAC环境下,这种情况似乎应该是这样设计的:引入一个权限“人居住的城市”,这个权限将拥有一个属性城市。然后创建一个角色,向其添加一个类型为“City=莫斯科”的权限,并将该角色分配给用户。看起来非常笨重的。
问题是,在我们的权限系统中引入这种非RBAC方法是否可以接受--这是否破坏了设计?
这似乎是一个原始的问题,但我们发现大多数应用程序都使用纯RBAC,我们开始认为我们可能做错了什么。
谢谢。
发布于 2010-05-15 14:46:48
对于基于属性的访问控制来说,这将是一个很好的例子。但是,如果您不介意查看PHP实现,Zend Framework有一个基于角色的访问控制,它使用断言来解决更多的特殊情况:
http://framework.zend.com/manual/en/zend.acl.advanced.html
标准规则允许角色对资源执行操作。第四个参数只允许在满足某些条件时应用规则。伪码:
allow(member, view, page) // standard
allow(member, view, page, userLivesInMoscow) // assertion used断言是传递给用户的对象。它有一个检查断言是否满足的方法:
interface Assertion
bool public function assert()
class UserLivesIn implements Assertion
public function UserLivesIn(User, City) ...
// implementation of assert method comes here这是实现所需内容的一种方法。
https://stackoverflow.com/questions/2839797
复制相似问题