如何在 Grav CMS 中设置用户权限以显示自定义配置选项卡而不显示任何其他配置选项卡?

问题描述 投票:0回答:1

我在 Grav CMS 安装中有一个自定义配置选项卡:

用户/蓝图/config/content.yaml

title: 'My Title'
form:
  validation: loose
  fields:
    images:
      type: section
      title: 'Images'
      underline: true

      fields:
      # Content fields 

它做了它应该做的事情。现在我想限制具有特定权限的用户对此选项卡的访问(admin.configuration.content:true)。由于管理插件似乎没有在权限树中显示自定义配置区域,因此我转到 user.yaml 文件并在那里输入它:

access:
  site:
    login: true
  admin:
    login: true
    cache: true
    configuration:
      content: true # this line and the one before added manually

这不会显示左侧菜单中的配置。一旦我另外添加标准配置选项卡之一,例如,它确实会显示

site: true
info: true

access:
  site:
    login: true
  admin:
    login: true
    cache: true
    configuration:
      site: true # now I see both configuration tabs, site and content
      content: true

我错过了什么吗?我与 GPT 进行了讨论,该 GPT 声称可以获得自定义用户权限或应该可以工作,但生成的示例毫无进展。文档也是如此。它似乎已经过时了:https://learn.getgrav.org/17/admin-panel/faq#managing-acl

我还尝试使用 Flex-objects 中的权限定义语法来查看它是否执行任何操作,但无济于事:

title: 'My Title'

config:
  admin:
    permissions:
      admin.content:
        type: crudpl
        label: 'Content'

form:
  validation: loose
  fields:
    images:
      type: section
      title: 'Images'
      underline: true

      fields:
      # Content fields 

是否有地方需要添加自定义权限,以便系统识别它并变得可用?最坏的情况我会允许信息和内容,但我更喜欢更干净的解决方案。

configuration yaml grav
1个回答
0
投票

了解问题

Grav CMS 后端的配置区域由管理插件生成。菜单项是硬编码的,目前还不支持自定义权限。这会导致看不到该选项卡,即使权限设置正确(并且用户如果有链接就可以访问配置)。

Grav CMS Configuration Menu entry

糟糕的解决方案

为了添加允许我们在配置部分显示自定义选项卡的自定义权限,可以按如下方式更改管理插件(可能,但不是一个好主意,每次更新都会被覆盖)。首先查看这些文件有助于理解其机制。

用户/插件/admin/permissions.yaml

# shortened example
actions:
  
  admin:
    actions:
      configuration:
        actions:
          content: # Add your custom permission here, don't remove anything from the file
            label: 'Manage Content Configuration'

用户/插件/admin/admin.php

public function onAdminMenu()
    {
        /** @var Twig $twig */
        $twig = $this->grav['twig'];

        // shortened

        // Configuration
        $twig->plugins_hooked_nav['PLUGIN_ADMIN.CONFIGURATION'] = [
            'route' => 'config',
            'icon' => 'fa-wrench',
            'authorize' => [
                'admin.configuration.system',
                'admin.configuration.site',
                'admin.configuration.media',
                'admin.configuration.security',
                'admin.configuration.info',
                'admin.configuration.content', #add your menu item here
                'admin.super'],
            'priority' => 9
        ];

更好的解决方案

  1. 创建自定义插件。
  2. user/plugins/admin/permissions.yaml 复制到您的自定义插件中,并使用您的自定义权限扩展它(见上文)
  3. 使用 Grav 核心中的 PermissionRegisterEvent 来注册事件并将其添加到菜单中:
   // use the PermissionRegisterEvent
   public static function getSubscribedEvents(): array {
       return [
           'onPluginsInitialized' => [
               ['onPluginsInitialized', 0]
           ],
           PermissionsRegisterEvent::class => ['onRegisterPermissions', 1000],
       ];
   }

   // enable the onAdminMenu-hook
   public function onPluginsInitialized(): void
   {
       // Enable the main events we are interested in
       $this->enable([
           'onAdminMenu'               => ['onAdminMenu', 1000]
       ]);
   }

   // same method as in the admin plugin
   public function onRegisterPermissions(PermissionsRegisterEvent $event): void {
       $actions = PermissionsReader::fromYaml("plugin://{$this->name}/permissions.yaml");

       $permissions = $event->permissions;
       $permissions->addActions($actions);
   }

   // extend the admin menu with your custom permission
   public function onAdminMenu() {
       /** @var Twig $twig */
       $twig = $this->grav['twig'];

       // Configuration
       $twig->plugins_hooked_nav['PLUGIN_ADMIN.CONFIGURATION']['authorize'][] = 'admin.configuration.content';
   }
© www.soinside.com 2019 - 2024. All rights reserved.