我想在我的应用程序中为两种类型的用户实现本机多重身份验证:User和Admin。
我开始实施新的
admins
表迁移(通过复制现有的 create_users_table)。我创建了一个名为Admin的新模型(通过复制现有的User模型)
两个(User和Admin)模型都进行了更新,以指定他们使用的守卫,如下所示:
用户模型
protected $guarded = ['user'];
管理模型
protected $guarded = ['admin'];
- 然后我像这样设置身份验证配置:
配置/auth.php
- 然后我定义了我的自定义身份验证路由
users
,admins
如下所示:
路线/web.php
https://pastebin.com/raw/CKX9Xddb
- 最后,我为这两种用户类型定义了身份验证保护路由,如下所示:
路线/web.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');
});
我在继续之前先测试了用户登录(要让管理员登录还有更多工作要做),通过进入http://myapp.local/login并输入我的凭据,我被成功重定向到用户的仪表板(即http:/ /myapp.local/manage)。所有用户特定的功能(例如重置通行证)等都可以正常工作)。
然而; 通过直接访问来测试来宾中间件时http://myapp.local/manage
,我预计会被重定向到http://myapp.local/login
但得到一个错误:
路线 [登录] 未定义。
这个错误是有效的;因为在路由定义中,我将用户登录名命名为user.login
看起来中间件使用了在未经身份验证的异常处理程序中guest
调用的硬编码命名路由。login
供应商\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login')); // <------
}
如何告诉来宾中间件使用不同名称的登录路由(当未经身份验证的用户尝试访问受身份验证保护的页面时)?
稍后我还需要将它用于管理访客中间件。