如何将“OR”中间件用于路由 laravel 5

2022-08-31 00:49:08

我有两种类型的用户,我已经创建了多个中间件。

某些路由需要同时允许这两种类型的用户。

我尝试了以下代码:

Route::group(['namespace' => 'Common', 'middleware' => ['Auth1', 'Auth2']], function() {
    Route::get('viewdetail', array('as' => 'viewdetail', 'uses' => 'DashboardController@viewdetail'));
}); 

但它不起作用:(


答案 1

中间件应该返回响应或将请求向下传递到管道。中间件彼此独立,不应该知道其他中间件的运行。

您需要实现一个单独的中间件,该中间件允许 2 个角色或单个中间件,该中间件将允许的角色作为参数。

选项 1:只需创建一个中间件,即 Auth1 和 Auth2 的组合版本,用于检查 2 种用户类型。这是最简单的选择,尽管不是很灵活。

选项 2:由于 5.1 版中间件可以采用参数 - 在此处查看更多详细信息:https://laravel.com/docs/5.1/middleware#middleware-parameters。您可以实现单个中间件,该中间件将获取要检查的用户角色列表,并在路由文件中定义允许的角色。下面的代码应该可以做到这一点:

// define allowed roles in your routes.php
Route::group(['namespace' => 'Common', 'middleware' => 'checkUserRoles:role1,role2', function() {
  //routes that should be allowed for users with role1 OR role2 go here
}); 

// PHP < 5.6
// create a parametrized middleware that takes allowed roles as parameters
public function handle($request, Closure $next) {

  // will contain ['role1', 'role2']
  $allowedRoles = array_slice(func_get_args(), 2);

  // do whatever role check logic you need
}

// PHP >= 5.6
// create a parametrized middleware that takes allowed roles as parameters
public function handle($request, Closure $next, ...$roles) {

  // $roles will contain ['role1', 'role2']

  // do whatever role check logic you need
}

答案 2

此示例 如何在 Laravel 5.2 中使用 OR 条件将多个参数传递给中间件

无需向 handle 方法添加多个参数,并且每次向应用程序添加新角色时都必须对其进行更新,而是可以使其动态化。

中间件

 /**
 * Handle an incoming request.
 *
 * @param $request
 * @param Closure $next
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
 */
public function handle($request, Closure $next) {

    $roles = array_slice(func_get_args(), 2); // [default, admin, manager]

    foreach ($roles as $role) {

        try {

            Role::whereName($role)->firstOrFail(); // make sure we got a "real" role

            if (Auth::user()->hasRole($role)) {
                return $next($request);
            }

        } catch (ModelNotFoundException $exception) {

            dd('Could not find role ' . $role);

        }
    }

    Flash::warning('Access Denied', 'You are not authorized to view that content.'); // custom flash class

    return redirect('/');
}

路线

Route::group(['middleware' => ['role_check:default,admin,manager']], function() {
    Route::get('/user/{user_id}', array('uses' => 'UserController@showUserDashboard', 'as' => 'showUserDashboard'));
});

这将检查经过身份验证的用户是否至少具有一个提供的角色,如果是,则将请求传递到下一个中间件堆栈。当然,方法和角色本身需要由您实现。hasRole()

你可以使用 php 5.6

public function handle($request, Closure $next, ...$roles)
{
    foreach ($roles as $role) {

        try {
            if ($request->user()->can($role)) {
              return $next($request);
        }

        } catch (ModelNotFoundException $exception) {
          abort(403);
        }
    }

}

推荐