Ошибка при попытке загрузки изображения в панели управления сайта, 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(). В чем может быть проблема?
Прошу прощения за большое количество воды, но я очень надеюсь на вашу помощь!