基于多个用户角色的路由级别的中间件

时间:2018-03-29 09:55:11

标签: php laravel routes laravel-routing laravel-middleware

我在laravel应用程序中有大约10种类型的用户角色,例如

  user_type_1 and user_type 4 are accessing url-1.
  user_type_7, user_type_5 and user_type 4 are accessing url-2.
  user_type_5, user_type_1, user_type_3 and user_type 6 are accessing url-3.
  ............................................
  ............................................
   n number of combination of routes. url according to user type.

我的route/web.php文件大约有1500条路由,目前没有使用中间件作为组分隔。我必须限制用户仅限于那种user_type授权的网址。你能否建议任何更好的方法来做到这一点。

我曾尝试将url与中间件组合在一起,如下所示,但经过一些工作后,这种方法仍然存在。

Route::group(['middleware' => ['middleware_user_type_1', 'middleware_user_type_2']], function () {
        Route::get('url-1', 'XYZController@someMethod');
    });

以这种方式请求首先进入数组中的第一个中间件,如果没有有效的用户类型,则不尝试使用第二个中间件。

3 个答案:

答案 0 :(得分:4)

您需要实现一个中间件并将用户类型传递给它。

Route::group(['middleware' => ['check_user_type:type_1,type_2']], function () {
        Route::get('url-1', 'XYZController@someMethod');
    });

看看spatie/laravel-permission角色中间件中实现了类似的逻辑。

Route::group(['middleware' => ['role:super-admin|writer']], function () {
    //
});

然后,中间件会通过分隔符展开角色字符串,然后检查当前用户是否具有任何角色。

答案 1 :(得分:0)

您可以在路由组中定义中间件和角色。首先,您要在中间件中定义角色管理。

Route::group(['middleware' => ['roles'], 'roles' => ['role_1','role_2], function () {
    Route::get('/index', [
        'uses' => 'ExampleController@index',
        'as'=> 'index'
    ]);
});

答案 2 :(得分:0)

开箱即用,您可以实施政策:

https://laravel.com/docs/5.6/authorization#creating-policies

问候。