pimcore / frontend-permission-toolkit-bundle
为数据对象中的前端应用配置权限提供了一种方法。
Requires
- pimcore/pimcore: ^11.0
- symfony/config: ^6.1
- symfony/dependency-injection: ^6.1
- symfony/event-dispatcher: ^6.1
- symfony/event-dispatcher-contracts: ^3.0
- symfony/security-core: ^6.1
Requires (Dev)
- phpstan/phpstan: ^1.10
README
添加了一些辅助工具来根据Pimcore对象定义网站中用户的权限。因此,复杂系统的用户权限可以直接在Pimcore对象中定义。
设置基于角色的权限系统的场景
- 用户作为具有许多权限权利(=权限资源)的对象表示
- 每个用户都与用户组(也是Pimcore对象)相关联,这些组也有许多权限权利(=权限资源)
安装说明
-
在您的pimcore项目中,将包作为依赖项要求
composer require pimcore/frontend-permission-toolkit-bundle
-
使用CLI命令启用包
bin/console pimcore:bundle:enable FrontendPermissionToolkitBundle
这将在您的pimcore项目中启用并安装包,并运行assets:install命令。或者,您也可以登录到管理员区域,转到“工具 > 扩展”,然后通过单击相应的图标从列表中启用包。
功能概述
-
Pimcore对象的附加数据类型
- 权限资源
- 表示一个特定的用户权利(例如登录)
- 可以有值
允许
拒绝
继承
- 动态权限资源
- 表示一组特定用户的权利
- 每个条目可以有值
允许
拒绝
继承
- 实际的权限资源由数据提供者定义
- 在类定义中定义,可以是类名或以
@
开头的服务名 - 数据提供者类需要实现
DataProviderInterface
并返回一个角色和标签的数组
public function getPermissionResources(array $context, \Pimcore\Model\DataObject\ClassDefinition\Data $fieldDefinition): array { // static example for explanation return [ ['value' => 'testpermission_1', 'label' => 'Permission for test'], ['value' => 'testpermission_2', 'label' => 'Another Permission for test'], ]; }
- 在类定义中定义,可以是类名或以
- 权限多对多关系:用于递归权限计算的默认数据类型
objects
的包装器。 - 权限一对一关系:用于递归权限计算的默认数据类型
href
的包装器。
- 权限资源
-
服务用于基于Pimcore对象和权限资源作为服务类
Service
检查用户权利,有两个方法Service::getPermissions
:- 返回给定对象的全部权限,自动合并与给定对象相关的所有权限资源对象或权限href。
- 合并:当权限在对象中直接设置为允许/拒绝时,始终使用。否则,使用乐观合并 -> 一旦一个权限被允许,它就会保持这种方式。
Service::isAllowed
:检查给定的对象是否允许给定的资源
服务使用键 bundle.frontendpermissiontoolkit.service
在容器中注册。
事件监听器
postGetPermissions事件监听器允许您在收集权限后对其进行操作。请注意,getPermissions方法可以递归执行。因此,请确保您添加了一个对象条件。
namespace AppBundle\EventListener; use FrontendPermissionToolkitBundle\Event\PermissionsEvent; use Pimcore\Model\DataObject\User; class PermissionsListener { public function postGetPermissions(PermissionsEvent $permissionsEvent): void { // Object the permissions are retrieved for $user = $permissionsEvent->getObject(); if (!$user instanceof User) { return; } // Access service methods to retrieve additional permissions and merge them $service = $permissionsEvent->getService(); $permissions = $permissionsEvent->getPermissions(); $mergedPermissions = $permissions; foreach ($user->getGroups() ?? [] as $userGroup) { $userGroupPermissions = $service->getPermissions($userGroup); $mergedPermissions = $service->mergeNestedObjectPermissions($mergedPermissions, $permissions, $userGroupPermissions); } // Update the permissions to return them from the service method $permissionsEvent->setPermissions($mergedPermissions); } }
service: AppBundle\EventListener\PermissionsListener: tags: - { name: kernel.event_listener event: frontendPermissionsToolkit.service.postGetPermissions method: postGetPermissions }
与Symfony Security集成
有关如何将Pimcore对象与Symfony Security集成的一般信息,请参阅Pimcore文档。
为了在Symfony Security定义中使用权限资源,可以将Pimcore对象的每个允许的权限资源导出为角色。
为此,将特性 FrontendPermissionToolkitBundle\CoreExtensions\Traits\PermissionResourcesAsRolesTrait
添加到您的Pimcore用户对象中,并确保对象中没有定义其他 getRoles
方法。此方法返回用户允许的所有权限资源,以数组形式返回,并使用 GROUP_
前缀。
因此,您可以在访问控制配置中使用权限资源,如下所示:
access_control: - { path: ^/special-offer-page, roles: ROLE_offer }
注意:要应用用户对象中权限的变化,用户必须注销并重新登录。
与Pimcore导航的集成
要在导航中显示/隐藏文档,您可以将权限资源作为属性分配给Pimcore文档。只需向文档添加一个名为permission_resource
的属性,其值为permissionResource
的名称。
此捆绑包(FrontendPermissionToolkitBundle\CoreExtensions\Navigation\Builder
)提供的一个特殊导航构建器可以基于当前用户的权限显示/隐藏导航中的文档。
为此,请将以下服务定义添加到您的应用程序中
Pimcore\Navigation\Builder: class: FrontendPermissionToolkitBundle\CoreExtensions\Navigation\Builder arguments: ['@pimcore.http.request_helper'] public: false calls: - [setService, ['@bundle.frontendpermissiontoolkit.service']] - [setCurrentUser, ['@security.token_storage']]
确保您禁用了Pimcore导航创建的缓存!
这仅隐藏导航中的文档。当文档通过其url直接调用时,它不会检查权限。请将额外的检查添加到控制器或访问控制中,以确保文档无法在没有权限的情况下被调用。