我在 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
是否有地方需要添加自定义权限,以便系统识别它并变得可用?最坏的情况我会允许信息和内容,但我更喜欢更干净的解决方案。
编辑:更新标题以更好地描述问题。
了解问题
Grav CMS 后端的配置区域由管理插件生成。菜单项是硬编码的,目前还不支持自定义权限。这会导致看不到该选项卡,即使权限设置正确(并且用户如果有链接就可以访问配置)。
糟糕的解决方案
为了添加允许我们在配置部分显示自定义选项卡的自定义权限,可以按如下方式更改管理插件(可能,但不是一个好主意,每次更新都会被覆盖)。首先查看这些文件有助于理解其机制。
用户/插件/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
];
更好的解决方案
// 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';
}