如何在Laravel 5.4中手动验证用户身份

时间:2017-08-21 05:47:12

标签: php laravel authentication laravel-5

我试图在laravel 5.4中对用户进行身份验证,使用attempt()我能够对用户进行身份验证,但是我还想检查用户是否处于活动状态,并根据用户是否处于非活动状态显示自定义消息那么不同的消息,如果用户名密码不同,那么不同的消息。

我的验证码:

int swap(const void *c, const void *d) 
{
   int n1 = *(int*)c;
   int n2 = *(int*)d;

   int d1 = numDigits(n1);
   int d2 = numDigits(n2);
   return compare0(n1, d1, n2, d2);
}

int compare0(int n1, int d1, int n2, int d2)
{
    if (d1 == d2)
        return n2 - n1;
    else if (d1 < d2)
        return  compare1(n1, d1, n2, d2);
    else
        return -compare1(n2, d2, n1, d1);
}

int compare1(int n1, int d1, int n2, int d2)
{
    int pd = (int) pow(10, d2 - d1);
    int nh2 = n2 / pd;
    if (n1 == nh2)
        return compare0(n1, d1, n2 % pd, d2 - d1);
    else
        return nh2 - n1;
}

int numDigits(int n)
{
    return (n == 0) ? 1 : 1 + (int) log10(n);
}

在这里,我首先要检查登录凭据是否正确,如果它们无效,那么它将直接显示错误消息“无效的用户名或密码”,如果假设登录凭证是正确的,那么我试图尝试登录,如果用户处于非活动状态,那么我想显示“您需要验证帐户”的消息,如果用户处于活动状态,则会将用户重定向到信息中心。

但在我的情况下,即使我密码并使用db表中的密码进行交叉检查,我也无法对用户进行身份验证。

2 个答案:

答案 0 :(得分:1)

通知评论。这应该有用。

  public function checklogin(Request $request)
    {
      $password = bcrypt($request->password);
      $userData = User::where('email',$request->email)->where('password',$password);
      if($userData->get()->count() > 0) //Check if User exists
      {
        if($userData->where('status','inactive')->get()->count() > 0) // Check if User is inactive
        {
          Mail::to($request->email)->send(new VerifyUser($userData->get()->first()));
          return redirect('/')->with('error','Your account is unverified - check your email for account verification link');
        }

        $credentials=array('email' => $request->input('email'),'password' => $password); // passing hashed password

        if(Auth::guard('users')->attempt($credentials)) 
          return redirect()->intended('/dashboard');
      }
      else
        return redirect('/')->with('error','Invalid username or password');
    }

答案 1 :(得分:1)

有很多方法可以做到这一点,但是,因为您在评论中提到您有兴趣让代码中的第4行工作

$userData = User::where('email',$request->email)->where('password',$password);

上面的行不起作用,因为bcrypt生成的新哈希值与数据库中的哈希密码不匹配。

您可以这样做:

$userData = User::where('email',$request->email)->first();

if ($userData && Hash::check($request->password, $userData->password))
{
    // The passwords match...
}