首页 > 解决方案 > 多重身份验证的 Laravel 身份验证问题

问题描述

我已经在 Laravel 中为管理员和具有两个表的用户进行了多重身份验证,但是在登录时,如果我输入任何密码,表单将我记录到仪表板,加上如果我尝试从仪表板访问任何链接,则将我重定向回登录?

LoginController LoginController Redirect If Authenticated RedirectIfAuthenticated
Authenticate Authenticate
AUTH Auth file
RouteAdmin Route

标签: laravel

解决方案


登录错误

仔细查看您的 LoginToDashboard 函数。您已经声明了名为 admins 的守卫,但是当您签入此功能时,您正在尝试使用名为 Admin。因此,它与您声明的守卫不匹配。所以,你可以让你的 LoginToDashboard 函数像这样->

//perform login here
public function LoginToDashboard(Request $request){
    //validation part
    $this->validate($request,[
       'email'=>'required|email',
        'password'=>'required|min:8'
    ]);
    //need to match your user's credentials
    if(Auth::guard('admin')->attempt(['email'=>$request->email,'password'=>$request->password],$request->remember)){
        return redirect()->intended(route('admin.dashboard'));
    }
    return redirect()->back()->withInupt($request->only('email','remember'));
}

现在让你的 auth.php 页面像这样->

 'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

现在来到名为 RedirectIfAuthenticated 的页面,并像这样对句柄函数进行更改->

 public function handle($request, Closure $next, $guard = null)
{
    switch ($guard){
        case 'admin':
            if(Auth::guard($guard)->check()){
                return redirect()->route('admin.dashboard');
            }
            break;
        default:
            if (Auth::guard($guard)->check()) {
       return redirect(RouteServiceProvider::HOME);
         }
            break;
    }


    return $next($request);
   }
  }

最后来到这部分,如果用户没有经过身份验证,那么方法是什么。您可以在 handler.php 页面中添加这样的函数

 protected function unauthenticated($request, AuthenticationException $exception)
{
    if ($request->expectsJson()) {
        return response()->json(['message' => $exception->getMessage()], 401);
    }

    $guard=Arr::get($exception->guards(),0);
    switch($guard){
        case'admin':
            $login='admin/login';
            break;
        default:
            $login='login';
            break;
    }
    return redirect()->guest($login);

    }

我想你得到了答案。让我知道您的进一步改进。


推荐阅读