【问题标题】:Laravel Auth, custom database & table, {"error":{"type":"ErrorException","message":"Undefined index: password"Laravel Auth, 自定义数据库 & 表, {"error":{"type":"ErrorException","message":"Undefined index: password"
【发布时间】:2014-09-09 22:48:56
【问题描述】:

使用 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 的文档,这就是我需要更改的全部内容。这是什么原因造成的?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

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

    $plain = $credentials['password'];
    

    身份验证要求'password' 字段存在于提供给Auth::attempt 的凭据中,而您却将其提供给'password_c',这就是您收到该错误的原因。

    该方法的第二行是这样的:

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

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

    但这不仅会起作用,因为您可能已经在上面的第二行中注意到,该类将期望 User 模型的实际实例,并且您自己承认您没有'没有任何 Eloquent 模型。

    我的建议是继续创建用户雄辩的模型,因为我相信您将不得不这样做。您不必将所有表都转换为模型,但如果您希望身份验证与 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 返回用户名列的名称。

    【讨论】:

    • 我将 MySQL 中的列名从 password_c 更改为 password 并且它没有返回错误。但是...尽管凭据应提供 true,但它返回 false。
    • 保持表格不变,但创建用户模型。如果带有密码的列名不是'password',那么您可以在用户模型中的getAuthPassword 方法中指定列名。这样,如果您有其他应用程序使用相同的数据库,它们将不受影响。
    • 现在,通过更改列名,有没有办法让它工作?它不是返回错误,而是返回 false。
    • 是的,我相信无论如何您都必须创建该用户模型。身份验证过程在用户实例上调用getAuthPassword,如果没有模型类,它就无法获取该实例。
    • app/models 中已经有一个 User 模型。我应该修改什么以使其正常工作?
    猜你喜欢
    • 2017-12-30
    • 2021-02-03
    • 1970-01-01
    • 2017-03-06
    • 2015-07-07
    • 2023-01-17
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多