如何在Laravel 5.2中将多个参数传递给具有OR条件的中间件

man*_*oos 12 laravel laravel-5.2

我正在尝试设置访问两个不同用户角色Admin,Normal_User的操作的权限,如下所示.

Route::group(['middleware' => ['role_check:Normal_User','role_check:Admin']], function() {
        Route::get('/user/{user_id}', array('uses' => 'UserController@showUserDashboard', 'as' => 'showUserDashboard'));
    });
Run Code Online (Sandbox Code Playgroud)

Admin或Normal_user可以访问此路由.但在此中间件配置中,用户必须同时是Admin和Normal_User.如何在中间件参数传递中添加OR条件?或者还有其他方法可以给予许可吗?

以下是我的中间件

public function handle($request, Closure $next, $role)
    {
        if ($role != Auth::user()->user_role->role ) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return response('Unauthorized.', 401);
            }
        }
        return $next($request);
    }
Run Code Online (Sandbox Code Playgroud)

有人可以回复吗?

Chr*_*ris 14

要添加多个参数,您需要使用逗号分隔它们:

Route::group(['middleware' => ['role_check:Normal_User,Admin']], function() {
        Route::get('/user/{user_id}', array('uses' => 'UserController@showUserDashboard', 'as' => 'showUserDashboard'));
    });
Run Code Online (Sandbox Code Playgroud)

然后你可以在你的中间件中访问它们,如下所示:

public function handle($request, Closure $next, $role1, $role2) {..}
Run Code Online (Sandbox Code Playgroud)

那里的逻辑取决于你实现,没有自动的方式来说"OR".


Den*_*ebe 13

每次向应用程序添加新角色时,不必向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('/');
}
Run Code Online (Sandbox Code Playgroud)

路线

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

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


小智 5

You can use the 3 dot (...) syntax in PHP 5.6+

Your middleware's handle function

public function handle($request, Closure $next, ...$roles)
{
    foreach($roles as $role){
        if ($request->user()->hasRole($role)){
            return $next($request);
        }
    }
    abort(404);
}
Run Code Online (Sandbox Code Playgroud)

  • 它被称为“splat operator” (2认同)