Как пройти более одного шлюза в промежуточном программном обеспечении? (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');
});
});