LoginController中的基于角色的路由(Auth)

时间:2016-12-17 06:53:07

标签: laravel laravel-5.3

在我的Laravel 5.3设置中,我使用的是Bouncer个包,我定义了两个角色admincustomer。登录后,客户将被重定向至/home,如protected $redirectTo = '/home';App\Http\Controllers\Auth\LoginController.php中指定的那样。现在,如果角色为admin的用户登录,则 重定向到/home,因为$redirectTo未对用户角色进行任何区分。我的目标是将管理员用户重定向到 /admin/home

处理此问题的最佳解决方案是什么?这是我的尝试。

web.php路由中,在任何中间件组之外:

Route::get('/home', function(Illuminate\Http\Request $request) { // http://myapp.dev/home
    if (Auth::user()->isA('customer')) // -> goto HomeController@index
        return app()->make('\App\Http\Controllers\HomeController')->index($request);
    else if (Auth::user()->isAn('admin')) // -> redirect
        return redirect('/admin/home');
    else
        abort(403);
})->middleware('auth');

Route::group(['prefix' => 'admin','middleware' => 'auth'], function () {
    Route::get('/home', 'Admin\HomeController@index');
});

或者,这也可以在中间件中完成:

Route::get('/home', 'HomeController@index')->middleware('auth', 'role');

// in VerifyRole.php middleware...    
public function handle($request, Closure $next, $guard = null)
{
    if (Auth::user()->isAn('admin')) {
        return redirect('/admin/home');
    }

    return $next($request);
}

这可行,但如果添加更多角色,则不是可扩展。我相信必须有一种优雅的内置方式来实现这一目标。所以问题是,如何根据用户的角色将用户路由到适当的信息中心(即home

2 个答案:

答案 0 :(得分:2)

您可以将班级authenticated()中的App\Http\Controllers\Auth\LoginController方法覆盖为:

protected function authenticated(Request $request, $user)
{
    if ($user->isA('customer'))
        return redirect('/home');
    else if ($user->isAn('admin'))
        return redirect('/admin/home');
}

或者

您可以将redirectPath()方法覆盖为:

public function redirectPath()
{
    if (auth()->user()->isA('customer'))
      return '/home';
    else if (auth()->user()->isAn('admin'))
      return '/admin/home';
}

答案 1 :(得分:0)

在Laravel 5.3中,您可以覆盖sendLoginResponse()中的AuthController.php方法,以便在登录后将用户重定向到其他路由。