是否有基于规则的访问控制的简单通用实现?

时间:2012-05-08 18:17:14

标签: web-applications architecture access-control

我正在实施内部网站点的访问控制。如果公司没有200多名员工并且几乎每个人都拥有自定义权限,这将很容易。我知道,这很疯狂,但我无法改变它。

所以,我试图找到一个满足我需求的通用实现,但找不到它,所以我自己去做。最后,我提出了一个相当通用的解决方案让我思考:有人必须在此之前完成它!

我称之为STOP(主题任务对象权限)访问控制。我有以下关系:

.-------.     .-----------.     .-------.
| users |1---*| STOPRules |*---1| tasks |
`-------'     '-----------'     '-------'

STOP规则具有以下属性

STOPRule {
    Subject;
    Task;
    ObjectType;
    Permission;
    Relation;
}

对象关系可以是:owner,creator,revisor等。此字段不是必需的,以支持通用任务。当它在那里时,当前用户和对象实例之间的关系由委托计算。然后将当前关系与规则上的所需关系进行比较,以允许或拒绝访问。

如果我不够清楚,请告诉我。

出现两个问题:

  1. 是否有像这样的开源实现?

  2. 您是否发现在此路径后会遇到任何问题?

  3. 编辑:我继续实际开始实施此模型。第一个问题是我需要主题和对象之间的关系来支持任何用例。现在,我可以存储以下规则:

    约翰(主题)可以(权限)修改(任务)订单(对象)如果他是订单的创建者(关系)。

    请问,你们能提供一个无法用这个模型表达的真实用例吗?

2 个答案:

答案 0 :(得分:1)

实际上,某个表具有某些角色的分组权限,并使用另一个表来覆盖常规权限的扩展权限。如果只是让约翰获取某些东西的情况,为什么还要提到对方的人不能?就像您在上面的评论中提供的最后一个示例一样:是否有一个具有权限的表。记录如下:1645 edit_some_field。然后,group_permissions类似于:1645 everyone false,最终的异常表为1645 (Jane Doe's ID) true

如果,让我们说有50人有权修改此字段,那么您只需在组表中添加另一个组,如:89 editors_of_field_X,将人员的ID放入表格group_members89 (John Smith's ID) true。然后在最后一步,您可以覆盖具有单人权限的那些,如上所述。总而言之,您将拥有3层方案。每个人组人。你越深入,角色就越重要。例如,如果不允许每个人,但允许您所在的组,则可以编辑某些内容。

此外,如果您不允许第三人称级别的访问,那么您再次成为该组中的例外。通过这种方式,您可以在以后重复使用组,只需添加少量更改。

答案 1 :(得分:1)

John创建了一个订单,并希望让Bob查看它。