我们目前在我们的网络应用程序(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。然后创建一个角色,向其添加“City = Moscow”类型的权限,并将角色分配给用户。看起来非常繁琐。
问题是否可以将这种非RBAC方法引入我们的权限系统 - 是否会破坏设计?
这似乎是一个原始问题,但我们发现大多数应用程序都使用纯RBAC,我们开始认为我们可能做错了。
谢谢。
答案 0 :(得分:1)
对于基于属性的访问控制,这将是一个很好的案例。但是,如果您不介意查看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
这是实现所需内容的一种方式。