Skip to content

Некорректое поведение со вложенными MenuGroup #12

Closed

Description

@Katel1ne

Если внутри MenuGroup будут вложены другие MenuGroup, то пользователь будет видеть их все, как и все MenuItem внутри них, если у него есть доступ хотя бы к одному.

return MenuRBAC::menu(
    MenuGroup::make('test.1', [
        MenuGroup::make('test.1.1', [
            MenuItem::make('test.1.1.1', new TestResource1),
            MenuItem::make('test.1.1.2', new TestResource2),
        ]),
        MenuGroup::make('test.1.2', [
            MenuItem::make('test.1.2.1', new TestResource3),
            MenuItem::make('test.1.2.2', new TestResource4),
        ]),
    ])
);

Activity

  1. yurizoom commented on Dec 13, 2024

    @yurizoom
    Contributor

    Столкнулся с такой же проблемой. Но она не связана с этим модулем. Он добавляет только к объектам меню видимость через canSee. Дальше уже это делает сам moonshine. Если убрать обертку MenuRBAC::menu и самому у вложенных добавить canSee(fn() => false), то они все равно будут отображаться

  2. DarkVen0m commented on Dec 16, 2024

    @DarkVen0m

    Столкнулся с такой же проблемой. Но она не связана с этим модулем. Он добавляет только к объектам меню видимость через canSee. Дальше уже это делает сам moonshine. Если убрать обертку MenuRBAC::menu и самому у вложенных добавить canSee(fn() => false), то они все равно будут отображаться

    Я по итогу использовал vendor patch и свою обертку
    moonshine-menumanager.patch
    Если вам для проекта, а не пакета - адекватный вариант, учитывая релиз Moonshine 3.0, крупных изменений в 2.0 ветке ждать не стоит.

    <?php
    
    namespace App\MoonShine;
    
    use MoonShine\Menu\MenuElement;
    use MoonShine\Menu\MenuItem;
    use MoonShine\MoonShineAuth;
    use MoonShine\Resources\ModelResource;
    use Sweet1s\MoonshineRBAC\Traits\WithRolePermissions;
    
    class MenuRoleBased
    {
        /**
         * This method is used to create menu items with permissions, if the user does not have permission to view the menu item, it will not be displayed
         *
         * @return MenuElement[]
         */
        public static function menu(MenuElement ...$items): array
        {
            $self = new self;
    
            foreach ($items as $item) {
                $self->checkPermission($item);
            }
    
            return $items;
        }
    
        private function checkPermission(MenuElement $item): void
        {
            if (method_exists($item, 'items')) {
                foreach ($item->items() as $item) {
                    $this->checkPermission($item);
                }
            }
    
            if (! $item instanceof MenuItem || ! $item?->getFiller() instanceof ModelResource) {
                return;
            }
    
            $resource = $item->getFiller();
            $hasRolePermissionsTrait = in_array(
                WithRolePermissions::class,
                class_uses_recursive($resource),
                true
            );
    
            if ($hasRolePermissionsTrait) {
    
                $item->canSee(function () use ($resource) {
                    return $this->userHasViewAnyPermission($resource);
                });
            }
        }
    
        private function userHasViewAnyPermission(ModelResource $resource): bool
        {
            $user = MoonShineAuth::guard()->user();
    
            foreach ($user->roles as $role) {
                if ($role->isHavePermission(class_basename($resource::class), 'viewAny')) {
                    return true;
                }
            }
    
            return false;
        }
    }
    
  3. LinenBen17 commented on Feb 9, 2025

    @LinenBen17

    Здравствуйте, как мне запустить патч? У меня самогон 2 версии но не могу найти файл MenuManager, с патчами никогда не работал, не могли бы вы мне помочь?

    Я попробовал запустить это:
    patch -p1 < moonshine-menumanager.patch
    Но это не работает.

  4. yurizoom commented on Feb 9, 2025

    @yurizoom
    Contributor

    Здравствуйте, как мне запустить патч? У меня самогон 2 версии но не могу найти файл MenuManager, с патчами никогда не работал, не могли бы вы мне помочь?

    Я попробовал запустить это: patch -p1 < moonshine-menumanager.patch Но это не работает.

    Патчи применяются в composer.json, например:

    "extra": {
        "patches": {
            "moonshine/moonshine": {
                ">= 2.0": "patches/moonshine-menumanager.patch"
            },
        }
    },
  5. lee-to commented on Feb 9, 2025

    @lee-to
    Collaborator

    Исправлено в релизе 2.23.5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions