web-dev-qa-db-ja.com

ルートに「OR」ミドルウェアを使用する方法laravel 5

ユーザー用に2つのタイプがあり、複数のミドルウェアを作成しました。

一部のルートでは、両方のタイプのユーザーを許可する必要があります。

私は次のコードを試しました:

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

しかし、それは機能していません:(

10
Govind Samrow

ミドルウェアは、応答を返すか、パイプラインに要求を渡すことになっています。ミドルウェアは互いに独立しており、実行されている他のミドルウェアを認識してはなりません。

2つの役割を許可する個別のミドルウェア、または許可された役割をパラメーターとして受け取る単一のミドルウェアを実装する必要があります。

オプション1:ミドルウェアを作成するだけで、2つのユーザータイプをチェックするAuth1とAuth2を組み合わせたバージョンになります。これは最も単純なオプションですが、実際には柔軟ではありません。

オプション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
}
14
jedrzej.kurylo

この例 OR condition in Laravel 5.2 でミドルウェアに複数のパラメーターを渡す方法

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

これにより、認証されたユーザーが提供されたロールの少なくとも1つを持っているかどうかがチェックされ、持っている場合は、要求が次のミドルウェアスタックに渡されます。もちろん、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);
        }
    }

}
_
4
ztvmark