Как пройти более одного шлюза в промежуточном программном обеспечении? (Laravel)

Я создаю систему управления обучением для своего проекта последнего года обучения в университете (только недавно познакомился с laravel). Я назначил три разные роли (администратор, инструктор и ученик). Я создал два представления, к которым могут получить доступ только администратор и преподаватель: "Управление пользователями" и "Управление курсом". Каждый администратор и преподаватель могут создавать пользователей / курсы и удалять их по мере необходимости. Студент не может просматривать их или имеет доступ к ним, поэтому они работают по своему усмотрению. Для этого я создал "управляющий пользователь" шлюза, а затем передал его промежуточному программному обеспечению.

Теперь я создал календарь, который я бы хотел, чтобы все роли пользователей просматривали... снова я создал для этого ворота... из-за моего текущего промежуточного программного обеспечения я получаю "несанкционированный доступ", когда студент пытается просмотреть календарь... возможно ли пройти через промежуточное ПО? Я попытался сделать это безуспешно... После многих попыток проб и ошибок я задал вопрос здесь, надеясь, что смогу понять это... я вставлю свой код ниже... любая помощь приветствуется.

AuthServiceProvider.php

public function boot()

{
    $this->registerPolicies();
    //User Management
    Gate::define('manage-users', function($user){
        return $user->hasAnyRoles(['admin', 'instructor']);
    });
    //Calendar
    Gate::define('manage-calendar', function($event){
        return $event->hasAnyRoles(['admin', 'instructor', 'student']);
    });

web.php

    Route::get('/', function () {
        return view('welcome');
    });

    Auth::routes();

    Route::get('/home', 'HomeController@index')->name('home');


    Route::namespace('Admin')->prefix('admin')->name('admin.')->middleware('can:manage-users')->group(function(){
        //Users
        Route::resource('/users', 'UsersController', ['except' => ['show']]);
        //Courses
        Route::resource('/courses', 'CoursesController', ['except' => ['show']]);



        Route::get('events', 'EventsController@index')->name('events.index');
        Route::post('/addEvents', 'EventsController@addEvent')->name('events.add');

    });

Я понимаю, что проблема заключается в определенных мной управляющих пользователях ворот... Я не уверен, как это сделать, чтобы защитить мои другие маршруты от студентов и инструкторов...

Заранее спасибо:)

1 ответ

Решение

В manage-users Gate не позволит пользователю с student роль пройти через промежуточное ПО, даже если manage-calendar Ворота делают.

Я предлагаю вам перегруппировать маршруты, чтобы применить промежуточное ПО, соответствующее каждому маршруту:

Route::namespace('Admin')->prefix('admin')->name('admin.')->group(function(){
    Route::middleware('can:manage-users')->group(function(){
        Route::resource('/users', 'UsersController', ['except' => ['show']]);
        Route::resource('/courses', 'CoursesController', ['except' => ['show']]);
    });
    Route::middleware('can:manage-calendar')->group(function(){
        Route::get('events', 'EventsController@index')->name('events.index');
        Route::post('/addEvents', 'EventsController@addEvent')->name('events.add');
    });
});
Другие вопросы по тегам