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

Sau*_*ory 6 architecture web-applications access-control

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

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

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

.-------.     .-----------.     .-------.
| users |1---*| STOPRules |*---1| tasks |
`-------'     '-----------'     '-------'
Run Code Online (Sandbox Code Playgroud)

STOP规则具有以下属性

STOPRule {
    Subject;
    Task;
    ObjectType;
    Permission;
    Relation;
}
Run Code Online (Sandbox Code Playgroud)

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

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

出现两个问题:

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

  2. 你看到我在这条路上会遇到什么问题吗?

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

John(主题)可以(许可)编辑(任务)订单(对象),如果他是订单创建者(关系).

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

And*_*ius 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 层方案。每个人-团体-人。你走得越深,这个角色就越重要。例如,如果不允许所有人,但允许您所在的组,那么您可以编辑某些内容。

此外,如果你不被允许进行第三人称级别的访问,那么你又会成为该组中的例外。这样您就可以在以后重用组,只需添加微小的更改。