【问题标题】:How to pass more than one gate in middleware? (Laravel)如何在中间件中通过多个门? (拉拉维尔)
【发布时间】:2020-06-05 07:48:53
【问题描述】:

我正在为我的大学最后一年项目创建一个学习管理系统(最近才引入 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');

    });

我知道问题出在我定义的门禁管理用户中。我不知道该怎么做才能保护我的其他路线免受学生和教师的伤害...

提前致谢:)

【问题讨论】:

  • 我不知道我是否很好地理解了这个问题,但是您尝试使用->middleware('can:manage-users,manage-calendar')
  • 嗨,感谢您的回复.. 是的,我做到了.. 不幸的是,它没有任何区别.. 仍然返回“未经授权的访问”

标签: laravel laravel-5 laravel-middleware laravel-gate


【解决方案1】:

manage-users Gate 不允许具有 student 角色的用户通过中间件,即使 manage-calendar Gate 允许。

我建议你重新组合路由以应用每个路由对应的中间件:

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');
    });
});

【讨论】:

  • 非常感谢。这有效,学生现在可以访问日历。向你致敬:)
猜你喜欢
  • 2018-04-11
  • 2018-07-06
  • 2021-10-20
  • 1970-01-01
  • 2017-08-22
  • 2021-08-31
  • 2018-05-16
  • 2016-07-28
  • 2023-03-07
相关资源
最近更新 更多