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