在我的Laravel 5.3设置中,我使用的是Bouncer个包,我定义了两个角色admin
和customer
。登录后,客户将被重定向至/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
)?
答案 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
方法,以便在登录后将用户重定向到其他路由。