我和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);
Run Code Online (Sandbox Code Playgroud)
登录方式
$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();
}
Run Code Online (Sandbox Code Playgroud)
用户模型
public static function boot()
{
parent::boot();
static::saving(function($data) {
$data->password = Hash::make($data->password);
unset($data->password_confirmation);
return true;
});
}
Run Code Online (Sandbox Code Playgroud)
问题是你使用了错误的事件监听器.
您错误地挂钩到save事件中,被称为每次有变化的用户模型(即在两个creating和updating).
这意味着每次用户登录并执行某些操作(更新登录计数,更改其名字等) - 它会导致模型重新散列已经散列的密码,从而导致其中断.
有两种方法可以解决这个问题.
选项一是将事件更改为仅适用于creating事件.但这意味着稍后当您需要更新用户密码时,它将无法正确重新散列,因此选项2更好.
选项2是不使用任何事件,而只使用赋值函数功能 -这是专为这个确切的情况.
class User extends Eloquent {
public function setPasswordAttribute($value)
{
$this->attributes['password'] = Hash::make($value);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,无论何时/何时更改用户密码,都将进行哈希处理,但仅在实际需要更改时.
小智 -1
在我看来你的问题在这里:
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');
Run Code Online (Sandbox Code Playgroud)
如果使用用户名的第一次身份验证尝试失败,它将在第二次身份验证尝试块之前从方法中返回重定向。这可能不是您面临的总体问题,但它似乎仍然是一段错误的代码。