pimcore/frontend-permission-toolkit-bundle

为数据对象中的前端应用配置权限提供了一种方法。

安装量: 94,878

依赖: 0

建议者: 0

安全性: 0

星标: 21

关注者: 14

分支: 12

开放性问题: 1

类型:pimcore-bundle

v2.0.4 2024-08-21 13:25 UTC

README

添加了一些辅助工具来根据Pimcore对象定义网站中用户的权限。因此,复杂系统的用户权限可以直接在Pimcore对象中定义。

设置基于角色的权限系统的场景

  • 用户作为具有许多权限权利(=权限资源)的对象表示
  • 每个用户都与用户组(也是Pimcore对象)相关联,这些组也有许多权限权利(=权限资源)

sample

安装说明

  1. 在您的pimcore项目中,将包作为依赖项要求

    composer require pimcore/frontend-permission-toolkit-bundle
    
  2. 使用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的名称。

Permission Property

此捆绑包(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直接调用时,它不会检查权限。请将额外的检查添加到控制器或访问控制中,以确保文档无法在没有权限的情况下被调用。