Auth::attempt 在 Laravel 5 中不起作用

Posted

技术标签:

【中文标题】Auth::attempt 在 Laravel 5 中不起作用【英文标题】:Auth::attempt not working in Laravel 5 【发布时间】:2016-05-17 06:19:34 【问题描述】:

我已经阅读了几十个类似的帖子,仍然无法使其工作。我总是收到“登录失败”消息。 这是我的用户表

CREATE TABLE users (
id int(10) unsigned NOT NULL,
first_name varchar(255) COLLATE utf8_unicode_ci NOT NULL,
last_name varchar(255) COLLATE utf8_unicode_ci NOT NULL,
slug varchar(255) COLLATE utf8_unicode_ci NOT NULL,
email varchar(255) COLLATE utf8_unicode_ci NOT NULL,
password varchar(255) COLLATE utf8_unicode_ci NOT NULL,
remember_token varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
updated_at timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

看到密码字段是 255,足够大以进行散列。

这是我的 App\Model\User 类

namespace App\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable

    protected $fillable = ['name', 'email', 'password'];
    protected $hidden = ['password', 'remember_token'];

这是登录控制器

namespace App\Http\Controllers\Backend;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class MainController extends Controller

    public function getLogin()
    
        return view('backend.login');
    

    public function postLogin(Request $request)
    
        if (Auth::attempt([
            'email'    => $request->input('email'),
            'password' => $request->input('password')
        ])) 
            echo 'login successful'; exit();
        
        else 
            echo 'login failed'; exit();
        
    

数据库中的用户记录被插入,密码设置为

Crypt::encrypt('123456')

这给了我将近 200 个字符长的散列密码存储在数据库中(这正常吗?)

我的 config.app 文件说

'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',

最后这是我的 config.auth 文件

return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Model\User::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
];

我试图从表单中转储 $request->input('email')/$request->input('password') ,一切都如预期的那样。 我试图转储查询日志,查询似乎是正确的('select * from users where email = ? limit 1,具有正确的电子邮件字段绑定)。

我还能检查什么? 有没有办法“深入检查” Auth::attempt to 检查那里出了什么问题?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

希望这篇文章对你有帮助

Hash::make($data['password'])

【讨论】:

【参考方案2】:

这里的问题是您使用Crypt::encrypt('123456') 设置用户密码。 Crypt 不用于此目的,因为它需要 Decrypt 才能工作,这在 Auth 类中没有实现

Simpy 在保存到数据库之前使用Hash 对密码进行哈希处理

例子:

User::create([ 
    'password' => Hash::make('123456'),
    'username' => 'hitman'
]);

您还可以通过将其添加到User 模型类来在用户模型中进行散列:

public function setPasswordAttribute($password)

    $salt = md5(str_random(64) . time());
    $this->attributes['password'] = \Hash::make($password);
    $this->attributes['salt'] = $salt;

然后你可以简单地这样做:

User::create([ 
    'password' => '123456', //hashing will be done in model
    'username' => 'hitman'
]);

【讨论】:

以上是关于Auth::attempt 在 Laravel 5 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Auth::attempt 在 Laravel 5.3 中总是返回 false?

Auth::attempt 在 Laravel 5 中不起作用

Laravel 5.1 注册后 Auth::attempt no access to the user data on another page

Laravel Auth::attempt() 返回 false

Laravel 4 - Auth::attempt() 不工作

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