首页 文章

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

提问于
浏览
9

我正在尝试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') }}
{{ Form::label('password', 'Password: ') }} {{ Form::password('password') }}
</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时,它都会返回“Wrong” . 我真的看不出这里有什么不对吗?

5 回答

  • 0

    您的代码是错误的,因为您将错误的变量传递给 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);
    }
    

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

  • 3

    在尝试之前不要哈希密码:

    $user = array(
            'email' => Input::get('email'),
            'password' => Input::get('password')
        );
    
        if (Auth::attempt($user)) {
            //return Redirect::intended('dashboard');
            return "ok.";
        } else {
            return "Wrong.";
        }
    
  • 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 .

  • 0

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

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

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

  • 6

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

相关问题