Auth::attempt 总是返回 false — 不选择密码

Posted

技术标签:

【中文标题】Auth::attempt 总是返回 false — 不选择密码【英文标题】:Auth::attempt always returns false — not selecting password 【发布时间】:2012-09-19 22:16:18 【问题描述】:

当尝试使用 Laravel 的 Auth 类时,我发现它总是失败,因为(AFAIK)尝试()方法只是尝试选择用户名:

string(55) "SELECT * FROM `mdl_user` WHERE (`username` = ?) LIMIT 1"

(通过 Event::listen('laravel.eloquent') 输出)

我使用 Eloquent 作为驱动,表字段是“用户名”和“密码”,我的模型(Moodle_User,位于 models/moodle/user.php)是这样写的:

class Moodle_User extends Eloquent 
    public static $table        = 'user';
    public static $connection   = 'moodle';

如果我按原样使用模型,它可以完美运行:

// returns the correct object
$user = Moodle_User::where('username', $username)->where('password', md5($password))->get(); 

另外,我没有使用 Hash 类,因为 Moodle 目前使用 MD5,所以我这样调用Auth::attempt()

Auth::attempt(array('username' => $username, 'password' => md5($password)))

但它总是返回 false。如果我通过 Moodle_User 模型做同样的事情,它会按预期工作。

为什么总是返回 false?

【问题讨论】:

如果您不想使用 Hash::make(),请创建自己的 Auth 驱动程序并对其进行扩展。 Eloquent Auth Driver 正在使用 Hash::check()。 【参考方案1】:

您应该使用Hash::make() 而不是md5() 来散列您的密码。

http://laravel.asia/p/laravel-authentication

我建议您使用自己的驱动程序,因为eloquent 驱动程序中的attemptfluent 驱动程序使用Hash::check()

https://github.com/laravel/laravel/blob/master/laravel/auth/drivers/eloquent.php#L53

https://github.com/laravel/laravel/blob/master/laravel/auth/drivers/fluent.php#L41

【讨论】:

正如我在问题中所说,我没有使用Hash::make(),因为我正在连接到使用 MD5 进行密码散列的外部数据库,因此不能选择使用 bcrypt。此外,作为stated in the manual,您无需散列密码即可使用Auth::attempt()(尽管推荐)。 您是否将用户名列设置为 username 而不是 email 是的。 'username' => 'username''password' => 'password'(数据库列的名称是这样的),我在 config.php 文件中设置了正确的模型 (Moodle_User)。此外,我在模型中设置了正确的静态变量。该模型有效,但身份验证无效。 我正在检查 Laravel 的源代码,我刚刚发现了这一点。感谢您指出这一点。

以上是关于Auth::attempt 总是返回 false — 不选择密码的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Auth::attempt 在 Laravel 5.3 中总是返回 false?

Laravel 5 Auth::attempt() 总是返回 false

Auth::attempt 总是返回 false,即使输入和哈希正确

auth laravel 总是返回 false

Auth::attempt 值始终为 false

Laravel Auth::attempt() 返回 false