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

时间:2013-06-14 15:15:35

标签: php authentication laravel

我正在尝试使用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',
    ),

);

数据库有电子邮件&amp;密码字段,密码字段是varchar(60)。 每当我将登录信息发送到/ login时,它都会返回“Wrong”。 我真的不知道这里有什么不对吗?

5 个答案:

答案 0 :(得分:6)

您的代码是错误的,因为您将错误的变量传递给Auth::attempt()。该方法需要一个包含密钥用户名,密码的数组,并可选择记住。鉴于此,您的上述代码应为:

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

这样,密码就会在每次设置时自动散列

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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

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

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

以下是来自laravel docs

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

  

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

     

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

答案 3 :(得分:0)

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

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

class User extends Eloquent implements UserInterface, RemindableInterface
{

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

答案 4 :(得分:0)

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