Laravel-admin HasPermissions несовместим с официальным механизмом авторизации (модельной политики) laravel.

Поскольку модель пользователя https://laravel-admin.org/ (Encore\Admin\Auth\Database\Administrator) использует таблицу базы данных для обработки разрешений (черта HasPermissions), которая в основном обрабатывает авторизацию CRUD модели через маршрут (статические авторизации, большая гранулярность, например, проверка определенной роли / пользователь может / не может CRUD других ресурсов).

И стандартная модель пользователя laravel предлагает ( traitIlluminate\Foundation\Auth\Access\Authorizable) и политику модели для обработки различных видов авторизации, а также поддерживает динамические проверки авторизации, такие как " может ли пользователь A изменять ресурс X?" '.

[проблема] Если мы хотим использовать администратора laravel-admin в качестве модели пользователя и использовать возможности авторизации laravel. Мы столкнемся с проблемой ниже,

HasPermissions laravel-admin конфликтует с Authorizable, например

Объявление Encore\Admin\Auth\Database\HasPermissions::cannot(string $permission): bool должно быть совместимо с Illuminate \ Foundation \Auth\User::cannot($abilities, $arguments = Array)

[подход решения A] Используйте разные пользовательские модели для администратора и внешнего пользователя / учетной записи. пользовательский интерфейс использует стандартную модель пользователя, аутентификацию и политику laravel, в то время как администратор использует laravel-admin.

Плюсы: нет настройки фреймворков; Минусы: возможно дублирование пользователей, если вы хотите, чтобы пользовательский интерфейс имел доступ к бэкэнду администратора.

[подход к решению B] Используйте пользовательскую модель администратора (например, MyAdmin) с характеристикой Authorizable, но не HasPermissions; и реализует методы черт (например, can/cannot и allPermissions()) как из базы данных разрешений, так и из логики Authorizable может / нельзя.

Плюсы: использование возможностей двух фреймворков; Минусы: из-за конфликтов признаков, описанных выше, мы должны перезаписать логику вызова всех методов признаков фреймворка, что подвержено ошибкам.

[подход решения C] Используйте только модель администратора laravel-admin и реализуйте динамическую авторизацию просто в методе вашей модели.

Вариант C.1: у вас просто есть несколько простых проверок аутентификации, таких как "если пользователь A владеет сообщением X, тогда A может CRUD X", тогда, возможно, просто добавьте один метод ownns в модель пользователя и напишите if(Admin::user()->owns(Post $post) ) { … }.

Вариант C.2: Пользовательский трейт (например, AdminAuthorizable) для использования laravel Gate&Policy и исключения конфликта с трейтом HasPermissions .

скопируйте трейт Authorizable и измените имена методов, например can=>has; не может => не имеет; Затем вы используете Admin::user()->has('own', $post), как обычно, как мы используем такую ​​политику стандартным способом laravel.

‌Этот AdminAuthorizable может выглядеть просто так:

<?php

namespace App\Admin\Traits;

use Illuminate\Contracts\Auth\Access\Gate;

trait AdminAuthorizable
{
    /**
     * Determine if the entity has the given abilities.
     *
     * @param  iterable|string  $abilities
     * @param  array|mixed  $arguments
     * @return bool
     */
    public function has($abilities, $arguments = [])
    {
        return app(Gate::class)->forUser($this)->check($abilities, $arguments);
    }

    /**
     * Determine if the entity does not have the given abilities.
     *
     * @param  iterable|string  $abilities
     * @param  array|mixed  $arguments
     * @return bool
     */
    public function hasnot($abilities, $arguments = [])
    {
        return ! $this->has($abilities, $arguments);
    }
}

связанное обсуждение: https://learnku.com/laravel/t/36265

0 ответов

Другие вопросы по тегам