sandstorm/neosacl

此包最新版本(2.3.1)没有可用的许可信息。

安装次数: 30,639

依赖: 0

建议者: 0

安全性: 0

星标: 14

关注者: 12

分支: 8

开放问题: 8

语言:JavaScript

类型:neos-package

2.3.1 2024-05-17 10:32 UTC

README

此包实现了Neos角色的动态访问控制列表。

此包的开发得到了ujamiiqueo的赞助。

主要功能

  • RestrictedEditor切换到仅允许列表的权限方法。通过安装此包,RestrictedEditor不再允许更改任何内容。
  • 通过Neos后端模块配置动态角色。
  • 可以在节点树、工作空间和维度上设置权限。
  • 权限以合理的默认值和纯累加逻辑可预测地工作。

listing

edit

安装

  1. 安装包
composer require sandstorm/neosacl
  1. 运行迁移
./flow doctrine:migrate
  1. 使用管理员账户登录并访问新的菜单项“动态角色”

开发

(包)初始设置

  • 将此包作为Sandstorm.NeosAcl克隆到Neos 4.3或更高版本的安装的DistributionPackages中
  • 将其添加到composer.json中为"sandstorm/neosacl": "*"
  • 运行composer update

初始React设置

cd Resources/Private/react-acl-editor
yarn
yarn dev

然后,登录到Neos的后端,并访问“动态角色”模块。

内部实现细节

实现动态节点权限和方法权限

基本思路如下:钩入PolicyService::emitConfigurationLoaded,并修改$configuration数组(引入新的角色和privilegeTargets)。这基本上在运行时工作 - 但是动态方法权限执行存在问题,以下将进行解释,并附上以下图表

Concept

方法权限是如何工作的

  • 背景:在Flow编译时,PointcutFilterInterface的实现可以决定哪些类和方法匹配某个方面。
    • 这用于PolicyEnforcementAspect(强制执行MethodPrivileges的中心点)。
    • 在那里,引用了MethodPrivilegePointcutFilter
    • MethodPrivilegePointcutFilterPolicyService请求所有配置的MethodPrivilege - 并确保为这些方法构建AOP代理。
  • 副作用:现在,在构建点cut过滤器时,MethodPrivilegePointcutFilter还额外构建了一个数据结构methodPermissions - 该数据结构记住哪些方法注册了哪些MethodPrivileges
    • 此数据结构存储在Flow_Security_Authorization_Privilege_Method缓存中。
    • 在运行时,对于被PolicyEnforcementAspect拦截的类,所有配置的MethodPrivilege都会被调用 - 它们必须快速决定是否匹配此特定调用点
    • 这是使用来自Flow_Security_Authorization_Privilege_Method缓存的methodPermissions数据结构完成的。

动态添加方法权限的问题是什么

  • 如果MethodPrivilege在运行时动态定义,则methodPermissions数据结构将缺少有关此新权限应调用某些方法的信息。
  • 注意:您只能为已经被AOP(面向切面编程)增强的调用点动态添加MethodPrivileges;否则,代码将永远不会被调用(因为缺少代理)。

我们主要与EditNodePrivilege等交互 - 那为什么这在这里适用呢?

  • EditNodePrivilege有一个内部MethodPrivilege,负责方法调用执行部分;即如果您没有权限执行,将阻止您调用例如NodeInterface::setProperty()

此外,为了让这个想法生效,本包的Policy.yaml定义了一个通配符Sandstorm.NeosAcl:EditAllNodes权限目标 - 因此AOP将增强NodeInterface的相应方法。在任何情况下,这种通配符都是有意义的,因为它将安全框架切换为仅允许列表的方法,使其更容易理解。

目标

为了使动态策略执行生效,我们需要为动态添加的角色添加自定义内容到methodPermissions

实现

使用自定义缓存前端(SecurityAuthorizationPrivilegeMethodCacheFrontend)进行methodPermissions的后处理。

实现动态AOP运行时表达式

方法权限内部可以使用动态AOP运行时表达式(如果您检查方法参数)。特别是MethodPrivilege - 它附加到RemoveNodePrivilege - 使用以下表达式代码

return 'within(' . NodeInterface::class . ') && method(.*->setRemoved(removed == true))';

removed == true部分是一个所谓的AOP运行时表达式

这是使用Flow_Aop_RuntimeExpressions "缓存"内部实现的,该缓存再次在编译时填充(这是一个讨厌的副作用)。

因此,在我们的情况下,我们需要再次实现一个自定义缓存前端(AopRuntimeExpressionsCacheFrontend),使用基配置的运行时表达式,该配置是正确存在的。