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

Posted

技术标签:

【中文标题】Laravel 4 Auth::attempt() 总是返回 false【英文标题】:Laravel 4 Auth::attempt() always returns false 【发布时间】:2013-06-11 07:07:15 【问题描述】:

我正在尝试 Laravel 的 Auth 类,但每次我尝试登录用户时,该方法都会返回 false。这是我的代码:

Routes.php

Route::get('new-user', function() 
    return View::make('register');
);

Route::post('new-user', function() 
    $name = Input::get('name');
    $email = Input::get('email');
    $password = Hash::make(Input::get('password'));

    $user = new User;
    $user->name = $name;
    $user->email = $email;
    $user->password = $password;

    $user->save();
);    

Route::get('login', function() 
        return View::make('login');
    );

    Route::post('login', function() 

        $user = array(
            'email' => Input::get('email'),
            'password' => Hash::make(Input::get('password'))
        );

        if (Auth::attempt($user)) 
            //return Redirect::intended('dashboard');
            return "ok.";
         else 
            return "Wrong.";
        

    );

views/login.blade.php

 Form::open(array('url' => 'login', 'method' => 'post')) 

    <h1>Login:</h1>

    <p>
         Form::label('email', 'Email: ') 
         Form::text('email') <br />

         Form::label('password', 'Password: ') 
         Form::password('password') <br />
    </p>

    <p>
         Form::submit('Login') 
    </p>

 Form::close() 

配置/auth.php

return array(

    'driver' => 'eloquent',
    'model' => 'User',
    'table' => 'users',
    'reminder' => array(
        'email' => 'emails.auth.reminder', 'table' => 'password_reminders',
    ),

);

数据库有电子邮件和密码字段,密码字段是 varchar(60)。 每当我将登录信息发送到 /login 时,它都会返回“错误”。 我真的看不出这里有什么问题?

【问题讨论】:

【参考方案1】:

这不起作用,因为 auth::attempt 使用 bcrypt 将密码转换为哈希,并在用户表中查找该哈希以匹配。

简而言之,密码应该是存储在数据库表中的哈希值,以便 auth::attempt 起作用。

这就是你的 if() 条件失败的原因。

您可以使用 bcrypt(password) 将密码作为哈希存储在数据库中,然后使用 auth::attempt

以下来自 laravel 文档

https://laravel.com/docs/5.2/authentication#authenticating-users

尝试方法接受一个键/值对数组作为它的第一个 争论。数组中的值将用于在 你的数据库表。因此,在上面的示例中,用户将是 通过电子邮件列的值检索。如果找到该用户,则 存储在数据库中的哈希密码将与 通过数组传递给方法的哈希密码值。如果两个 哈希密码匹配一个经过身份验证的会话将被启动 用户。

如果身份验证成功,则尝试方法将返回 true。 否则返回false。

【讨论】:

【参考方案2】:

检查您的密码长度。数据库中必须为 60 或更高。

【讨论】:

【参考方案3】:

你应该在你的模型类中实现 laravel 提供的 UserInterface 类:

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface

请记住,它有 2 个抽象方法,您应该在模型中声明它们。可以关注原User.php模型

【讨论】:

【参考方案4】:

您的代码出错了,因为您将错误的变量传递给Auth::attempt()。该方法需要一个带有用户名、密码和可选记住键的数组。鉴于此,您的上述代码应为:

Route::post('login', function()

    $credentials = [
        'username' => Input::get('email'),
        'password' => Input::get('password')
    ];

    dd(Auth::attempt($credentials));
);

希望对您有所帮助。

我还会给你额外的代码 sn-ps 来改进你的工作流程。存储新用户的路径:

Route::post('register', function()

    $input = Input::only(['username', 'email', 'password']);

    // validate data

    Eloquent::unguard();

    $user = User::create($input);

    Auth::loginUsingId($user->id);

    return Redirect::to('dashboard');
);

然后在你的用户模型中添加方法

public function setPasswordAttribute()

    $this->password = Hash::make($this->password);

这样每次设置密码都会自动散列

【讨论】:

【参考方案5】:

在尝试之前不要散列密码:

    $user = array(
        'email' => Input::get('email'),
        'password' => Input::get('password')
    );

    if (Auth::attempt($user)) 
        //return Redirect::intended('dashboard');
        return "ok.";
     else 
        return "Wrong.";
    

【讨论】:

它仍然返回错误(“错误”) 根据文档 (four.laravel.com/docs/security#storing-passwords),密码未经散列传递给尝试()。我确定这是一个问题,但您可能有不止一个问题。确保密码正确存储在您的用户表中。 这是我在数据库中存储用户的方式:Route::post('new-user', function() $name = Input::get('name'); $email = Input::get('email'); $password = Hash::make(Input::get('password')); $user = new User; $user-&gt;name = $name; $user-&gt;email = $email; $user-&gt;password = $password; $user-&gt;save(); ); 抱歉,我不知道如何在此处正确显示代码。 是的,安东尼奥是正确的。创建用户帐户时,您必须在保存密码之前对其进行哈希处理。当你使用 Auth::attempt 时,使用 'password' => Input::get('password')。 Laravel 将对其进行哈希处理并将哈希输入的密码与哈希存储的密码进行比较。散列/未散列的任何其他组合都将失败。

以上是关于Laravel 4 Auth::attempt() 总是返回 false的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 Auth::attempt($userdata, false) 身份验证仍然保留

Laravel 4 Auth:尝试不工作

Laravel Auth::attempt 会话过期

在 Auth::attempt() Laravel 5.1 中禁用重定向

Laravel Auth::attempt() 可以处理关系吗?

Auth::attempt 不工作。拉拉维尔 4