symbiote/silverstripe-restrictedobjects

为SilverStripe中的数据对象提供更高级别的权限管理。

安装次数1,238

依赖项: 2

建议者: 0

安全: 0

星标: 18

关注者: 1

分支: 10

公开问题: 7

类型:silverstripe-module

3.0.2 2020-06-22 05:25 UTC

README

此模块将SilverStripe的对象访问模块锁定为默认情况,这意味着默认情况下,对象没有权限,除非明确授予节点(或树)上的用户权限,但管理员用户始终可以访问所有对象)

新的权限访问模型有几个与现有模型略有不同的概念,并借鉴了Alfresco中的模型。

  • 权限 - 描述能力的低级单元。例如,查看、写入、发布、更改权限。在编写代码时,需要检查权限,这些是检查的内容
  • 角色 - 权限的分组。例如,编辑角色由查看和编辑权限组成
  • 权限 - 系统中的用户或组
  • 授权 - 明确说明用户能否做某事(权限被授权或拒绝给权限)

在现有的SilverStripe模型中,角色和权限是高级概念,没有与系统中的内容相关的上下文。它们覆盖了高级权限概念,如“访问CMS”。对于节点特定的控制,仅支持显式支持允许查看或编辑权限。

此新模型允许您直接针对节点或节点的树指定更精细的访问限制。例如,可以指定用户可以在树的某个部分执行编辑角色(提供查看和写入访问),但也可以访问树的另一个部分的经理权限(编辑加上发布/删除等)。

此外,您可以在用户在更高点已获得权限的树中的节点内明确拒绝访问。

最后,新模型支持内容所有者的概念,他们对他们自己创建的内容以及允许创建的区域(几乎)具有不受限制的访问权限。

维护者联系方式

版本

此模块的主分支目前旨在与SilverStripe 3.1兼容

需求

  • SilverStripe 3.0+

安装

  • 将此目录放置在您的SilverStripe安装的根目录中。请确保文件夹名称为restrictedobjects
  • 运行dev/build并使用?disable_perms=1参数 - 在开发模式下,可以使用此标志禁用权限,以确保正确安装
  • 分配扩展
Object::add_extension('Page', 'Restrictable');
Object::add_extension('SiteConfig', 'Restrictable');
Object::add_extension('Page', 'RestrictedPage');
  • 再次运行dev/build,并以管理员身份登录系统
  • 在您的“站点”对象上,确保已启用“允许公共访问”复选框,以便网站仍然可查看。
  • 创建以下DB索引;SS没有提供很好的方式来做到这一点,而且静态$indexes似乎也不起作用...
    • ALTER TABLE AccessAuthority ADD INDEX ( ItemID , ItemType ) ;

典型用例

您何时想使用此模型?

从最终用户的角度看

  • 您想要管理具有特定结构权限集的数据对象的访问权限
  • 您希望为特定权限授予对网站树中某一部分的访问权限,但不对其他部分授予,并且这些权限不仅仅是“读取”或“写入”。
  • 您想要定义与树结构中组织角色相匹配的角色。
  • 您希望在网站树的一个部分中拒绝特定权限的权限,同时在上方和下方授予广泛的权限。

从开发者角度

  • 您希望定义特定于您所管理功能的功能权限,使用动词来描述权限,使用名词来描述将这些权限组合在一起的角色。
  • 您希望确保在访问或修改节点之前,执行代码时检查访问权限。
  • 您希望避免编写显式代码来管理自己的模块或网站的定制权限分配。

快速入门

要使用受限对象模块管理权限,通常需要执行以下几个步骤

  • 导航到您想要应用权限的节点(网站配置、页面或自定义数据对象类型)。
  • 在权限选项卡上,点击“添加访问权限”
  • 选择要赋予用户的角色。这将授予他们在CMS访问角色部分中定义的此角色的权限
  • 选择要授予此角色的成员或组
  • 选择是授予还是拒绝此权限
  • 点击“保存”
  • 一旦权限表刷新,您将看到授予该“权限”的所有权限。

一些默认访问角色在安装系统时自动创建。您可以通过访问角色部分访问它们。要定义新角色,您只需创建一个新的AccessRole项目,并在其中选择要使用的权限。

角色分配是在任何内容项的“权限”选项卡上完成的。您可以指定为用户或组分配的角色,以及您是授予还是拒绝该角色。您还可以选择要应用或撤销的单独权限。

要定义新的低级别权限项,您必须定义一个实现PermissionDefiner(与默认的SilverStripe接口PermissionProvider不要混淆)的类,并在definePermissions()方法中返回一个简单的字符串数组。这些字符串应该是您在$obj->checkPerm('CustomPerm');中检查的权限

有关更多信息,请参阅(wiki)[https://github.com/nyeholt/silverstripe-restrictedobjects/wiki]

继承权限

除了通过ParentID查找提供权限继承之外,在某些情况下,可能有多个对象会被视为权限确定的“父对象”。为了支持这一点,权限查找机制允许开发者定义一些机制来提供这个继承源对象

直接在数据对象上

  • 可以返回SS_List的父对象的effectiveParents()方法
  • 可以返回数据对象的effectiveParent()方法

通过扩展子类

  • updateEffectiveParents(&$parentNodes)可以添加更多节点到有效父节点列表中

权限缓存

所有权限在查找后立即缓存,包括任何继承权限的结果,这意味着后续的数据更改可能会更改此继承结构。为了解决这个问题,系统还缓存了一些关键数据关系,即

  • $node继承权限的节点列表,按source_nodeType_nodeID索引。这包括所有代际祖先,而不仅仅是直接父母
  • 提供继承权限的所有节点的图。

因此,在层次结构中修改任何节点后,任何依赖节点的缓存数据都可以立即清除。