[英]Allow only ROLE_ADMIN to manage users in Sonata Admin
我有一個使用sonata-project/admin-bundle
4.9 和sonata-project/user-bundle
5.0.0-rc.1 的 Symfony 5.4 項目,我只想讓具有角色ROLE_ADMIN
的用戶管理用戶 (CREATE/LIST/編輯/刪除),對於其他角色,我想隱藏導航欄菜單條目和“用戶”的儀表板條目。
在我的config/packages/sonata_admin.yml
,我嘗試指定一個sonata.user.block.menu
條目,如在一些舊問題中找到的那樣,但它似乎不再存在,因為拋出了以下錯誤:
An exception has been thrown during the rendering of a template ("The block type "sonata.user.block.menu" does not exist").
默認情況下,我只有一個 admin_list 塊,我嘗試添加一個 sonata.block.service.rss 並且它在儀表板中正確顯示,但我找不到如何管理用戶塊。
sonata_admin:
title: 'Sonata Admin'
dashboard:
blocks:
- { type: sonata.admin.block.admin_list, position: left }
#- { type: sonata.user.block.menu, position: right, roles: [ROLE_ADMIN]}
#- { type: sonata.block.service.rss, position: right, roles: [ROLE_ADMIN]}
templates:
layout: sonataLayout.html.twig
sonata_block:
blocks:
sonata.admin.block.admin_list:
contexts: [admin]
有什么提示嗎? 解釋性圖片如下。
注意。 “根據角色禁用兩者”。 它不是“只是添加/更改 2 行”
恕我直言。 “基本”Sonata Admin 的配置不太明顯。 因此盡可能定制 -> 以獲得更多控制。
我只能建議 U -> go 這種“正確的方式”(當然,恕我直言)
使用這種方法 -> U 可以通過您的角色輕松管理菜單項。 + 肯定還有其他優勢
從一開始 -> 創建自定義模板。 如果你關注 Flex & /templates/admin
是 Sonata Admin 的文件夾:
// config/packages/sonata_admin: sonata_admin.... templates: .... layout: '/admin/standard_layout.html.twig' knp_menu_template: '/admin/menu/knp_menu.html.twig' dashboard: 'admin...
2* 例如擴展默認布局。 如果您的特定模板執行以下操作:
{% extends '@SonataAdmin/standard_layout.html.twig' %}
{% block sonata_nav %}
...
在這些步驟之后 - >更容易通過您的角色控制視圖
因此,根據文檔,我為菜單添加了一個事件偵聽器,並且能夠像這樣從左側面板中刪除條目
//src/EventListener/MenuBuilderListener.php
<?php
namespace App\EventListener;
use Sonata\AdminBundle\Event\ConfigureMenuEvent;
use Symfony\Component\Security\Core\Security;
final class MenuBuilderListener
{
private $security;
public function __construct( Security $security)
{
$this->security = $security;
}
public function manageMenuItems(ConfigureMenuEvent $event): void
{
$menu = $event->getMenu();
$user = $this->security->getUser();
if(!$user->hasRole("ROLE_ADMIN")){
$menu->removeChild('sonata_user');
}
}
}
使用此處注冊的服務
//config/services.yaml
app.menu_listener:
class: App\EventListener\MenuBuilderListener
tags:
- { name: kernel.event_listener, event: sonata.admin.event.configure.menu.sidebar, method: manageMenuItems }
然后我添加了一個防火牆條目來管理權限
//config/packages/security.yaml
access_control:
- { path: ^/admin/app/sonatauseruser/, role: [ROLE_ADMIN]}
到目前為止,我無法從儀表板中刪除用戶條目,我嘗試擴展儀表板 twig 模板,但似乎稍后以某種方式添加了用戶條目。
{% extends '@SonataAdmin/Core/dashboard.html.twig' %}
{% block content %}
{% set has_left = false %}
{% dump(blocks.left) %} //this shows only the admin group and not the user group
{% for block in blocks.left %}
{% if not has_left and (block.roles|length == 0 or is_granted_affirmative(block.roles)) %}
{% set has_left = true %}
{% endif %}
{% endfor %}
....
{{ sonata_block_render_event('sonata.admin.dashboard.top') }}
....
{{ sonata_block_render_event('sonata.admin.dashboard.bottom') }}
我還嘗試將 render events.top 和 .bottom 都綁定到 ConfigureEvent Listener 但它們沒有被觸發(不確定這是否是正確的 class 監聽器)。
現在我找到了一個次優的解決方案,我像這樣覆蓋了 userAdmin class
<?php
namespace App\Admin;
use Sonata\UserBundle\Admin\Model\UserAdmin as BaseType;
class UserAdmin extends BaseType
{
protected function configureDashboardActions(array $actions): array
{
$actions = parent::configureDashboardActions($actions);
unset($actions['list']);
unset($actions['create']);
return $actions;
}
}
並將其注冊在
//config/packages/sonata_user.yaml
sonata_user:
admin:
user:
class: App\Admin\UserAdmin
controller: SonataAdminBundle:CRUD
因此,“用戶”儀表板元素顯示時沒有任何可用操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.