簡體   English   中英

僅允許 ROLE_ADMIN 管理 Sonata Admin 中的用戶

[英]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]

有什么提示嗎? 解釋性圖片如下。

Sonata 用戶根據角色禁用

注意 “根據角色禁用兩者”。 它不是“只是添加/更改 2 行”

恕我直言。 “基本”Sonata Admin 的配置不太明顯。 因此盡可能定制 -> 以獲得更多控制。

我只能建議 U -> go 這種“正確的方式”(當然,恕我直言)

  1. 使用事件偵聽器創建/管理管理菜單。 你可以在那里閱讀/檢查很好的例子 使用事件來允許擴展菜單和官方 -> Sonata Admin -> KnpMenu

使用這種方法 -> U 可以通過您的角色輕松管理菜單項。 + 肯定還有其他優勢

  1. 從一開始 -> 創建自定義模板。 如果你關注 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM