欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何使用'或'中间件路线laravel 5 How to use 'OR' middleware for route laravel 5

中间件应该要么返回一个响应或请求传递到管道。中间件是相互独立的,不应该知道其他中间件运行。

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

选择1:只需创建一个中间件是一个auth1和auth2,2用户类型检查结合版。这是最简单的选择,虽然不是很灵活。

选择2因为:5.1版本中间件可以带参数-在这里看到更多的细节:http:/ / laravel。COM /文档/ 5.1 /中间件#中间件参数。你可以实现一个单一的中间件,将用户角色表核对,只是定义了允许的角色在你的路径文件。下面的代码应该做的伎俩:

// 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
}
分享编辑
 

这个例子如何传递多个参数的中间件或条件在Laravel 5.2

而你的处理方法添加多个参数和更新,每次你添加一个新的角色,你的应用程序,你可以让它动。

中间件

 /**
 * 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);
        }
    }

}
分享编辑
 

来自  https://stackoverflow.com/questions/39344836/how-to-use-or-middleware-for-route-laravel-5


普通分类: