Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Laravel 5.5中使用Guard实现本机多身份验证(用户与管理员),guest中间件使用硬编码的命名路由_Laravel_Authentication_Laravel 5_Laravel 5.5_Auth Guard - Fatal编程技术网

在Laravel 5.5中使用Guard实现本机多身份验证(用户与管理员),guest中间件使用硬编码的命名路由

在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 =

我想在我的应用程序中为两种类型的用户实现本机多重身份验证:UserAdmin

  • 我开始实施新的
    admins
    表迁移(通过复制现有的create\u users\u表)

  • 我创建了一个名为Admin的新模型(通过复制现有用户模型)

  • 两个(用户和管理员)模型都进行了更新,以指定它们使用的防护装置,如下所示:

  • 用户型号

    protected $guarded  = ['user'];
    
    protected $guarded  = ['admin'];
    
    管理型号

    protected $guarded  = ['user'];
    
    protected $guarded  = ['admin'];
    
  • 然后,我按如下方式设置身份验证配置:
  • config/auth.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')); // <------
    } 
    

  • 然后,我为
    用户
    管理员
    定义了自定义身份验证路由,如下所示:
  • 路由/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');
    
    });
    
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        return $request->expectsJson()
                    ? response()->json(['message' => $exception->getMessage()], 401)
                    : redirect()->guest(route('login')); // <------
    } 
    

  • 最后,我为以下两种用户类型定义了受身份验证保护的路由:
  • 路由/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');
    
    });
    
    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
    ,因此我说命名路由是硬编码的,我正试图找到一种方法来覆盖它。