我试图在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表中的密码进行交叉检查,我也无法对用户进行身份验证。
答案 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...
}