Auth::attempt()总是返回false


Laravel 4 Auth::attempt() always returns false

我正在尝试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.";
        }
    });

视图/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时,它都会返回"错误"。我真的看不出有什么问题。

您的代码正在调试,因为您将错误的变量传递给Auth::attempt()。该方法需要一个数组,其中包含键username, password和(可选)remember。因此,上面的代码应该是:

Route::post('login', function()
{
    $credentials = [
        'username' => Input::get('email'),
        'password' => Input::get('password')
    ];
    dd(Auth::attempt($credentials));
});

希望对你有帮助。

我还会给你一些额外的代码片段来改进你的工作流程。存储新用户的路由:

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);
}

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

尝试前不要散列密码:

    $user = array(
        'email' => Input::get('email'),
        'password' => Input::get('password')
    );
    if (Auth::attempt($user)) {
        //return Redirect::intended('dashboard');
        return "ok.";
    } else {
        return "Wrong.";
    }

这不起作用,因为auth::attempt使用bcrypt将密码转换为散列,并在users表中查找要匹配的散列。

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

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

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

来自laravel docs

https://laravel.com/docs/5.2/authentication用户身份验证

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

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

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

use Illuminate'Auth'UserInterface;
use Illuminate'Auth'Reminders'RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface
{

记住它有2个抽象方法,你应该在你的模型中声明。您可以遵循原始User.php模型

检查密码长度。