9

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

路由.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 时,它都会返回“错误”。我真的看不出这里有什么问题?

4

5 回答 5

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

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

于 2013-06-17T06:37:27.433 回答
5

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

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

    if (Auth::attempt($user)) {
        //return Redirect::intended('dashboard');
        return "ok.";
    } else {
        return "Wrong.";
    }
于 2013-06-14T15:17:36.220 回答
1

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

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

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

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

以下来自 laravel 文档

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

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

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

于 2016-05-26T08:59:24.167 回答
0

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

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

class User extends Eloquent implements UserInterface, RemindableInterface
{

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

于 2014-01-24T14:28:55.553 回答
0

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

于 2014-11-14T14:55:23.380 回答