如何使用 Laravel 5.2 中的两个身份验证中间件之一保护路由



我在我的 laravel 项目中使用了多个身份验证,它工作正常:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
    'admins' =>[
        'driver' => 'session',
        'provider' => 'admins',
    ],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => AppUser::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => AppAdmin::class,
    ],
],

但是我在保护我的一些路线方面遇到了问题。我希望这些路由由两种类型的身份验证保护访问。如果"管理员"防护用户已登录,或者"用户"防护用户已登录我希望能够访问路由。现在我的路线是这样的:

Route::group(['middleware' =>'auth'], function () {
    Route::get('/add/tutorial',[
        'uses'=>'AddTutorialController@getAddTutorialIndex',
        'as'=>'frontend.add.tutorial'
    ]);
});

有了这个,只有我的"用户"保护中的用户可以访问此路由。

我想访问类似这样的东西:

Route::group(['middleware' =>['auth' OR 'auth:admins']],...

有没有办法让两个身份验证守卫访问路由?? 我应该使用哪种中间件组?

如果可以向 \app\Http\Middleware\Authenticate 添加一个附加参数.php例如:

public function handle($request, Closure $next, $guard = null, $default = false)
{
    if($guard && $default) {
        // check for specified $guard OR default guard
        $authorized = Auth::guard($guard)->guest() || Auth::guard(null)->guest();
    } else {
        // use specified guard ( or null if non given )
       $authorized = Auth::guard($guard)->guest();
    }
    if ($authorized) {
        if ($request->ajax() || $request->wantsJson()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
    }
    return $next($request);
}

有了它,您可以在路由组中指定一个附加参数:

Route::group(['middleware' => 'auth:admins,true'], function() {
    Route::get('/', function () {
        dd('inside');
    }); 
});

如果使用 auth:admins,true,则默认防护和指定的防护(管理员)将使用 OR 进行检查。

如果仅使用身份验证,则将使用默认保护。如果您使用身份验证:管理员管理员防护将仅使用。

这只是一个简单的例子。您可以根据需要对其进行调整,甚至可以编写自己的中间件。

我找到了 3 种方法,如果你能找到有用的:-

第一种方式:-

routes.php
Route::group(['middleware' =>['auth', 'auth:admins']], function () {
    Route::get('/add/tutorial',[
        'uses'=>'AddTutorialController@getAddTutorialIndex',
        'as'=>'frontend.add.tutorial'
    ]);
});

第二种方式:-

routes.php
Route::get('/add/tutorial',[
   'uses'=>'AddTutorialController@getAddTutorialIndex',
   'as'=>'frontend.add.tutorial'
])->middleware(['auth', 'auth:admins']);

第三种方式:-

routes.php
Route::get('/add/tutorial',[
   'uses'=>'AddTutorialController@getAddTutorialIndex',
   'as'=>'frontend.add.tutorial'
])

yourcontroller.php
class YourController extends Controller{ 
    public function __construct(){
       $this->middleware(['auth', 'auth:admins']);
    }
}

最新更新