gpt4 book ai didi

php - Laravel Auth::Attempt 仅在第一次进行身份验证

转载 作者:可可西里 更新时间:2023-11-01 12:19:16 24 4
gpt4 key购买 nike

我在使用 Laravel 时遇到了一个奇怪的问题。

正常创建用户后,用户可以第一次登录,但此后,Auth::attempt 总是失败。我只能通过代码更新用户密码来再次登录,当我检查数据库时,所有密码都已正确散列。

我似乎无法理解为什么会这样。这是我的代码

注册方法

$user = new User;
$user->username = Input::get('username');
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->save();
$general = Role::find(3);
$user->roles()->attach($general->id);

登录方式

$username = Input::get('username');
$pwd = Input::get('password');
if (!($pwd && $username)) {
return Redirect::intended('user/login')->withMessage('Emtpy username/password')->withInput();
}
if (Auth::attempt(array('username' => $username, 'password' => $pwd))){
return Redirect::intended('user/dashboard');
}
elseif (Auth::attempt(array('email' => $username, 'password' => $pwd))) {
return Redirect::intended('user/dashboard');
}
else {
return Redirect::intended('user/login')->withMessage('Incorrect username/password')->withInput();
}

用户模型

public static function boot()
{
parent::boot();

static::saving(function($data) {
$data->password = Hash::make($data->password);
unset($data->password_confirmation);
return true;
});
}

最佳答案

问题是您正在使用 wrong event listener .

您错误地连接到 save 事件,每次用户模型发生变化时调用该事件(即在 creating更新)。

这意味着每次用户登录并执行一些操作(更新登录计数、更改他们的名字等)- 它会导致模型重新散列已经散列的密码,从而呈现它坏了。

有两个选项可以解决这个问题。

选项一是将事件更改为仅对 creating 事件起作用。但这意味着稍后当您需要更新用户密码时,它不会被正确地重新散列,所以选项 2 更好。

选项 2 是不使用任何事件,and just use a mutator function - 专为这种确切情况而设计。

class User extends Eloquent {

public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}

}

这样,无论何时何地有人更改用户密码,它都会被散列,但只有在实际需要更改时才会这样做。

关于php - Laravel Auth::Attempt 仅在第一次进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24878419/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com