ユーザー用に2つのタイプがあり、複数のミドルウェアを作成しました。
一部のルートでは、両方のタイプのユーザーを許可する必要があります。
私は次のコードを試しました:
Route::group(['namespace' => 'Common', 'middleware' => ['Auth1', 'Auth2']], function() {
Route::get('viewdetail', array('as' => 'viewdetail', 'uses' => 'DashboardController@viewdetail'));
});
しかし、それは機能していません:(
ミドルウェアは、応答を返すか、パイプラインに要求を渡すことになっています。ミドルウェアは互いに独立しており、実行されている他のミドルウェアを認識してはなりません。
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
}
この例 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);
}
}
}
_