Laravel Auth,自定义数据库& table,{“error”:{“type”:“ErrorException”,“message”:“Undefined index:password”

时间:2014-07-18 17:57:07

标签: php laravel

创建登录路线&使用Laravel的Auth类和我的数据库。由于必须使用大型遗留数据库,因此不使用Eloquent。

我知道不应该使用SHA1,但数据库中的数千个帐户使用它并且我还没有迁移。

Route::post('login', function() {
    $user = array(
        'username_c' => Input::get('username'),
        'password_c' => sha1(Input::get('password'))
    );

    if(Input::has('username') && Input::has('password')) {
        if(Auth::attempt($user)) {

            return json_encode(array('result' => true));
        }
    }

    return json_encode(array('result' => false));
});

当我输入有效凭据时,它会在控制台中回显此错误:

{"error":{"type":"ErrorException","message":"Undefined index: password","file":"\/var\/www\/html\/vendor\/laravel\/framework\/src\/Illuminate\/Auth\/DatabaseUserProvider.php","line":135}}

这可能是什么问题?我编辑了app / config / auth.php并将'table'更改为我的表格,将'driver'更改为'database'

通过阅读Laravel的文档,我需要改变。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:3)

如果查看被引用的行,您会看到:

$plain = $credentials['password'];

身份验证期望提供给'password'的凭据中存在Auth::attempt字段,而您提供'password_c'代替,这就是您需要的原因得到那个错误。

该方法的第二行是:

 return $this->hasher->check($plain, $user->getAuthPassword());

这基本上是检查输入中提供的普通密码是否与存储在数据库中的值匹配。这意味着您的输入键名称​​不需要匹配数据库列的名称。数据库列的名称由上面的$user->getAuthPassword()方法调用确定。您需要将传递给Auth::attempt的密钥设为'password',而不是'password_c'

但这不会起作用,因为你可能已经在上面的第二行注意到该类会期望一个User模型的实际实例,并且你自己承认你没有任何雄辩的模特。

我的建议是继续创建用户雄辩的模型,因为我相信你将不得不这样做。您不必将所有表格都转换为模型,但如果您希望身份验证能够与Laravel的Auth外观一起使用,那么我不会想到任何方式在它周围。

<强>更新

This answer还有一个很好的方法来更新当前密码,以便在身份验证尝试期间使用Laravel哈希,并使用MD5(旧的哈希函数,在您的情况下可以使用sha1)。

更新2

您需要将身份验证逻辑更改为如下所示:

Route::post('login', function() {
    if(Input::has('username') && Input::has('password')) {
        $user = array(
            'username' => Input::get('username'),
            'password' => sha1(Input::get('password'))
        );
        if(Auth::attempt($user)) {

            return json_encode(array('result' => true));
        }
    }

    return json_encode(array('result' => false));
});

确保您的用户模型的getAuthPassword方法返回密码列的名称,getAuthIdentifier返回用户名列的名称。