如何使用laravel 5.2中的两个auth中间件之一来保护路由

时间:2016-07-07 09:14:01

标签: 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' => App\User::class,
    ],

    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
],

但我保护我的一些路线有问题。我想通过两种类型的身份验证保护来访问这些路由。如果' 管理员 '如果' 用户 ' OR ,则保护用户已登录保护用户已登录,我希望能够访问该路由。现在我的路线是这样的:

Route::group(['middleware' =>'auth'], function () {

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

并且只有这一点,我的用户才能使用'警卫可以访问这条路线。

我想要访问类似这样的内容:

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

有没有办法让两个授权警卫都能访问路线?我应该使用哪种中间件组?

2 个答案:

答案 0 :(得分:1)

如果您可以在\ 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检查默认警卫和指定警卫(管理员)。

如果您只使用 auth ,则会使用默认防护。如果您使用身份验证:管理员 管理员警卫将仅被使用。

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

答案 1 :(得分:0)

我找到了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']);
    }
}