symbiote / silverstripe-restrictedobjects
为SilverStripe中的数据对象提供更高级别的权限管理。
Requires
- silverstripe/cms: >=3.0.0
- symbiote/silverstripe-multivaluefield: ~2.4
README
此模块将SilverStripe的对象访问模块锁定为默认情况,这意味着默认情况下,对象没有权限,除非明确授予节点(或树)上的用户权限,但管理员用户始终可以访问所有对象)
新的权限访问模型有几个与现有模型略有不同的概念,并借鉴了Alfresco中的模型。
- 权限 - 描述能力的低级单元。例如,查看、写入、发布、更改权限。在编写代码时,需要检查权限,这些是检查的内容
- 角色 - 权限的分组。例如,编辑角色由查看和编辑权限组成
- 权限 - 系统中的用户或组
- 授权 - 明确说明用户能否做某事(权限被授权或拒绝给权限)
在现有的SilverStripe模型中,角色和权限是高级概念,没有与系统中的内容相关的上下文。它们覆盖了高级权限概念,如“访问CMS”。对于节点特定的控制,仅支持显式支持允许查看或编辑权限。
此新模型允许您直接针对节点或节点的树指定更精细的访问限制。例如,可以指定用户可以在树的某个部分执行编辑角色(提供查看和写入访问),但也可以访问树的另一个部分的经理权限(编辑加上发布/删除等)。
此外,您可以在用户在更高点已获得权限的树中的节点内明确拒绝访问。
最后,新模型支持内容所有者的概念,他们对他们自己创建的内容以及允许创建的区域(几乎)具有不受限制的访问权限。
维护者联系方式
- Marcus Nyeholt marcus@silverstripe.com.au
版本
此模块的主分支目前旨在与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
) ;
- ALTER TABLE
典型用例
您何时想使用此模型?
从最终用户的角度看
- 您想要管理具有特定结构权限集的数据对象的访问权限
- 您希望为特定权限授予对网站树中某一部分的访问权限,但不对其他部分授予,并且这些权限不仅仅是“读取”或“写入”。
- 您想要定义与树结构中组织角色相匹配的角色。
- 您希望在网站树的一个部分中拒绝特定权限的权限,同时在上方和下方授予广泛的权限。
从开发者角度
- 您希望定义特定于您所管理功能的功能权限,使用动词来描述权限,使用名词来描述将这些权限组合在一起的角色。
- 您希望确保在访问或修改节点之前,执行代码时检查访问权限。
- 您希望避免编写显式代码来管理自己的模块或网站的定制权限分配。
快速入门
要使用受限对象模块管理权限,通常需要执行以下几个步骤
- 导航到您想要应用权限的节点(网站配置、页面或自定义数据对象类型)。
- 在权限选项卡上,点击“添加访问权限”
- 选择要赋予用户的角色。这将授予他们在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索引。这包括所有代际祖先,而不仅仅是直接父母
- 提供继承权限的所有节点的图。
因此,在层次结构中修改任何节点后,任何依赖节点的缓存数据都可以立即清除。