Ошибка при попытке загрузки изображения в панели управления сайта, Orchid, Laravel

На разрабатываемом сайте реализована мульти-авторизация, предполагающая наличие нескольких групп пользователей (а соответственно, моделей и таблиц). Из всех упомяну только две, так как проблема связана именно с ними: users (обычные пользователи) и admins (администраторы сайта).

Проблема заключается в том, что если быть авторизованным как admin и user одновременно, то при попытке загрузить изображение в панели управления, падает следующая ошибка

"message": "Call to undefined method App\\Models\\User::hasAccess()",
"exception": "BadMethodCallException",
"file": "/var/www/u2059043/data/www/api.bookingcourt.ru/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php",
"line": 67,

Как видно по message ошибки, Orchid вызывает метод hasAccess('platform.systems.attachment') почему-то у класса обычного пользователя (User), а не администратора (Admin)

Класс Admin.php

namespace App\Models\Admin;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Orchid\Access\UserAccess;
use Orchid\Filters\Filterable;
use Orchid\Metrics\Chartable;
use Orchid\Platform\Models\User as Authenticatable;
use Orchid\Screen\AsSource;

class Admin extends Authenticatable
{
    use AsSource, Chartable, Filterable, HasFactory, Notifiable, UserAccess;

    protected $table = 'admins';
    protected $guard = 'admin';

    protected $fillable = [
        'name',
        'email',
        'password',
        'permissions',
    ];

    protected $hidden = [
        'password',
        'remember_token',
        'permissions',
    ];

    protected $casts = [
        'permissions'          => 'array',
        'email_verified_at'    => 'datetime',
    ];

    protected $allowedFilters = [
        'id'         => Where::class,
        'name'       => Like::class,
        'email'      => Like::class,
        'updated_at' => WhereDateStartEnd::class,
        'created_at' => WhereDateStartEnd::class,
    ];

    protected $allowedSorts = [
        'id',
        'name',
        'email',
        'updated_at',
        'created_at',
    ];
}

Класс User.php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable implements MustVerifyEmail
{
    use HasApiTokens, HasFactory, Notifiable;

    protected $table = 'users';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at'    => 'datetime',
    ];

    /**
     * The attributes for which you can use filters in url.
     *
     * @var array
     */
    protected $allowedFilters = [
        'id',
        'name',
        'email',
    ];

    /**
     * The attributes for which can use sort in url.
     *
     * @var array
     */
    protected $allowedSorts = [
        'id',
        'name',
        'email',
        'updated_at',
        'created_at',
    ];
}

Если у User поменять Authenticatable на тот, что у Admin, то при загрузке изображения будет падать 403 ошибка, говорящая о том, что у пользователя (User) нет прав на загрузку (как я написал выше, идет поиск разрешения 'platform.systems.attachment', но его у пользователя и быть не должно)

Немного покопавшись по коду, я обнаружил, что в файле Orchid\Platform\Http\Controllers\Controller прописана конструкция Auth::user()..

protected function checkPermission(string $permission): void
    {
        $this->middleware(static function ($request, $next) use ($permission) {
            if (Auth::user()->hasAccess($permission)) {
                return $next($request);
            }
            abort(403);
        });

        abort_if(Auth::user() !== null && ! Auth::user()->hasAccess($permission), 403);
    }

И, как я понимаю, проблема именно в этом. И как я думаю, мне нужно поменять Auth::user() на Auth::guard('admin')->user(), а сделать это можно, получается, переопределив (?) класс

Следуя официальной документации, в файле AppServiceProvider я прописал следующее

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Orchid\Platform\Dashboard;

use Orchid\Platform\Http\Controllers\AttachmentController ;
use Orchid\Platform\Http\Controllers\Controller;

use App\Http\Controllers\Custom\Orchid\CustomAttachmentController;
use App\Http\Controllers\Custom\Orchid\CustomController;

class AppServiceProvider extends ServiceProvider
{
    public function boot(Dashboard $dashboard)
    {
        Dashboard::configure([
            'model' => [
                AttachmentController::class => CustomAttachmentController::class,
                Controller::class           => CustomController::class,
            ],
        ]);
    }
}

Но, раз я написал сюда, мне это не помогло - Orchid все равно вызывает App\Models\User::hasAccess(). В чем может быть проблема?

Прошу прощения за большое количество воды, но я очень надеюсь на вашу помощь!


Ответы (0 шт):