我正在尝试为Laravel 5.3应用程序设置Doctrine 2 Auth。我正在使用Laravel生成的Auth控制器,所以它不是我自己的自定义实现。我做了一些小的更改(即使用Doctrine将用户持久保存到数据库)并使注册正常工作,但是当我尝试登录时,它仍然无法进行身份验证。
我已经使用了一个调试器,它似乎一直在函数hasValidCredentials(位于vendor / laravel / framework / src / Illuminate / Auth / SessionGuard.php)上失败,详情如下:
/**
* Check the given plain value against a hash.
*
* @param string $value
* @param string $hashedValue
* @param array $options
* @return bool
*/
public function check($value, $hashedValue, array $options = [])
{
if (strlen($hashedValue) === 0) {
return false;
}
return password_verify($value, $hashedValue);
}
作为参考,$ value和$ hashedValue的值如下:
$ value =“tester”;
$ hashedValue =“$ 2y $ 10 $ ZSLRE3LAVA8myaH8mu6TNeumQxHdmKRbv / zZdFQeDujZ8JolshTOu”;
根据我上次的XDebug会话,变量的屏幕截图显示了变量的确切类型:
$ hashedValue是密码“tester”的加密版本(使用bcrypt),因此我知道凭据是100%正确的,但是当执行命中password_verify时,它总是计算为false,然后hasValidCredentials检查失败。
所以我知道散列密码足够长并存储在数据库中。我看到$ hashedValue以双引号返回,这可能是个问题吗?
无论我无法登录,因为Session Guard类的尝试功能总是失败,因为hasValidCredentials始终返回false,因为凭据准确无误,我感到非常难过。
想知道是否有人对如何解决这个问题有任何想法?
由于
答案 0 :(得分:1)
password_verify是一个原生的php函数,基本上是password_hash的对应物。因为
password_verify('tester', '$2y$10$ZSLRE3LAVA8myaH8mu6TNeumQxHdmKRbv/zZdFQeDujZ8JolshTOu');
返回false
,您的$hashedValue
不加密值为tester
。
我的猜测是你以某种方式加密了你的密码,例如:您的laravel组件和您的doctrine组件都会散列密码值。
请注意,laravel的app.key
不用于加密密码,您可以在BcryptHasher中看到,因此它不会影响结果。