在Laravel 5.5中使用Guard实现本机多身份验证(用户与管理员),guest中间件使用硬编码的命名路由
我想在我的应用程序中为两种类型的用户实现本机多重身份验证:User和Admin在Laravel 5.5中使用Guard实现本机多身份验证(用户与管理员),guest中间件使用硬编码的命名路由,laravel,authentication,laravel-5,laravel-5.5,auth-guard,Laravel,Authentication,Laravel 5,Laravel 5.5,Auth Guard,我想在我的应用程序中为两种类型的用户实现本机多重身份验证:User和Admin 我开始实施新的admins表迁移(通过复制现有的create\u users\u表) 我创建了一个名为Admin的新模型(通过复制现有用户模型) 两个(用户和管理员)模型都进行了更新,以指定它们使用的防护装置,如下所示: 用户型号 protected $guarded = ['user']; protected $guarded = ['admin']; 管理型号 protected $guarded =
admins
表迁移(通过复制现有的create\u users\u表)protected $guarded = ['user'];
protected $guarded = ['admin'];
管理型号
protected $guarded = ['user'];
protected $guarded = ['admin'];
// User auth protected pages
Route::prefix('manage')->middleware('auth:user')->namespace('Manage')->group(function() {
Route::get('/', 'DashboardController@index');
});
// Admin auth protected pages
Route::prefix('admin')->middleware('auth:admin')->namespace('Admin')->group(function() {
Route::get('/', 'DashboardController@index');
});
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login')); // <------
}
用户
和管理员
定义了自定义身份验证路由,如下所示:// User auth protected pages
Route::prefix('manage')->middleware('auth:user')->namespace('Manage')->group(function() {
Route::get('/', 'DashboardController@index');
});
// Admin auth protected pages
Route::prefix('admin')->middleware('auth:admin')->namespace('Admin')->group(function() {
Route::get('/', 'DashboardController@index');
});
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login')); // <------
}
// User auth protected pages
Route::prefix('manage')->middleware('auth:user')->namespace('Manage')->group(function() {
Route::get('/', 'DashboardController@index');
});
// Admin auth protected pages
Route::prefix('admin')->middleware('auth:admin')->namespace('Admin')->group(function() {
Route::get('/', 'DashboardController@index');
});
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login')); // <------
}
在继续之前,我通过进入并输入我的凭据,首先测试了用户登录(要让管理员登录还有很多工作要做),我成功地被重定向到用户的仪表板(即)。所有用户特定功能(如重置通行证)等。。一切正常)
但是,;通过访问http://myapp.local/manage
直接,我希望被重定向到http://myapp.local/login
但却出现了一个错误:
未定义路由[登录]
此错误是有效的;因为在路由定义中,我将用户登录名命名为user.login
看起来guest
中间件在未经身份验证的异常处理程序中使用了名为login
的硬编码命名路由
vendor\laravel\framework\src\illumb\Foundation\Exceptions\Handler.php
// User auth protected pages
Route::prefix('manage')->middleware('auth:user')->namespace('Manage')->group(function() {
Route::get('/', 'DashboardController@index');
});
// Admin auth protected pages
Route::prefix('admin')->middleware('auth:admin')->namespace('Admin')->group(function() {
Route::get('/', 'DashboardController@index');
});
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login')); // <------
}
未经身份验证的受保护函数($request,AuthenticationException$exception)
{
return$request->expectsJson()
?response()->json(['message'=>$exception->getMessage()],401)
:redirect()->guest(路由('login');//
我已将用户登录名命名为user.login
出现错误是因为路由名称为user.login
,并且您正在尝试使用login
路由。因此,请在此处使用正确的路由名称:
redirect()->guest(route('user.login'));
使用Request::is()
检查请求的url
,然后重定向:
protected function unauthenticated($request, AuthenticationException $exception)
{
if(\Request::is('manage/*')){
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('user.login'));
}
else if(\Request::is('admin/*')){
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('admin.login'));
}
else{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login'));
}
}
注意:感谢Sohel0415
的回答,在App\Exceptions\Handler中添加此方法;我意识到App\Exceptions\Handler
扩展了vendor\laravel\framework\src\lighting\Foundation\Exceptions\Handler.php
,这意味着我可以这样解决它:
我编辑了app\Exceptions\Handler.php
,如下所示:
包括顶部的use
语句:
使用Illumb\Auth\AuthenticationException
添加此方法:
你是说我需要重写异常处理程序吗?如果是,如何重写以及在何处重写?感谢更新,你可以按照此链接进行操作;它给了我一个稍微不同的解决方法。请参阅我的答案。很好,+1:)我不想使用重定向()->guest(路由('login'));
-这就是框架所附带的内容,我在上面发布的这行代码取自:vendor\laravel\framework\src\light\Foundation\Exceptions\Handler.php
,因此我说命名路由是硬编码的,我正试图找到一种方法来覆盖它。