【发布时间】:2019-10-25 01:10:32
【问题描述】:
我正在将一个站点迁移到 laravel 框架中,旧站点的数据库将用户密码存储为明文。显然这是个问题,所以我使用this code 对密码进行哈希处理。客户还要求用户能够通过他们的用户名登录,所以我编辑了默认登录控制器来解决这个问题。创建一个新帐户并登录它可以正常工作,但尝试登录现有帐户总是返回无效凭据。
我从php artisan make:auth 开始,并从那里编辑了生成的文件。
我尝试在迁移中以及在 php artisan tinker 中对密码进行哈希处理。我也尝试在迁移和修补程序中使用$user->password = Hash::make($user->password); 而不是$user->password = bcrypt($user->password);。我每次尝试登录时都得到相同的结果。
如果我在 artisan tinker 中使用 Hash::make,然后 Hash::check 针对创建的哈希和明文密码,它会返回 true,但是当我尝试使用这些凭据登录时,它会失败。 bcrypt 为 Hash::check in tinker 返回 false。使用 bcrypt 为 Hash::needsRehash 返回 true,而 Hash::make 返回 false。
用户名设置为唯一的。
用户模型:
protected $primaryKey = 'user_id';
protected $fillable = [
'username', 'password',
];
protected $guarded = [];
protected $hidden = [
'password', 'remember_token',
];
public function getAuthPassword()
{
return $this->password;
}
登录控制器:
use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
public function username()
{
return 'username';
}
login.blade 用户名/密码表单字段:
<div class="form-group row">
<label for="username" class="col-md-4 col-form-label text-md-right">{{ __('Username') }}</label>
<div class="col-md-6">
<input id="username" type="text" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autofocus>
@error('username')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
我希望能够登录现有帐户,但当我尝试(使用原始数据库的备份检查密码)时,我收到一个典型的“这些凭据与我们的记录不匹配”。用户输入错误密码会收到错误。
【问题讨论】:
-
问题出在您最初的密码没有散列!
-
我向您保证,将密码存储为纯文本不是我的决定!这个数据库太旧了。关于如何解决这个问题的任何见解?
-
老我的意思是十多年前。我只是必须让它发挥作用的可怜的笨蛋。
-
试试这个让我们看看它是否有效。获取其中一个明文密码和 bcrypt(password) 它。然后尝试使用它登录。
-
我已经尝试过了,但是在再次查看它的过程中,我发现了我的问题!在某些时候,我在数据库中的密码字段被更改为 20 的长度,因此没有保存完整的密码哈希。哎呀!