Laravel 4 Auth:尝试不工作
Posted
技术标签:
【中文标题】Laravel 4 Auth:尝试不工作【英文标题】:Laravel 4 Auth:attempt not working 【发布时间】:2013-05-30 18:51:49 【问题描述】:我很难使用 Laravel 4 Auth::attempt 方法,遵循正确的文档,阅读了几个 SO 线程,但我仍然无法让它工作。
$userData = array('email' => 'admin@admin.com','password' => 'admin');
if(Auth::attempt($userData))
// redirect
else
echo 'Invalid';
而且每次都返回 Invalid
现在我不确定真正的原因是什么。
在我的 config/auth.php 我有以下内容
<?php
return array(
/*
|--------------------------------------------------------------------------
| Default Authentication Driver
|--------------------------------------------------------------------------
|
| This option controls the authentication driver that will be utilized.
| This drivers manages the retrieval and authentication of the users
| attempting to get access to protected areas of your application.
|
| Supported: "database", "eloquent"
|
*/
'driver' => 'eloquent',
/*
|--------------------------------------------------------------------------
| Authentication Model
|--------------------------------------------------------------------------
|
| When using the "Eloquent" authentication driver, we need to know which
| Eloquent model should be used to retrieve your users. Of course, it
| is often just the "User" model but you may use whatever you like.
|
*/
'model' => 'User',
/*
|--------------------------------------------------------------------------
| Authentication Table
|--------------------------------------------------------------------------
|
| When using the "Database" authentication driver, we need to know which
| table should be used to retrieve your users. We have chosen a basic
| default value but you may easily change it to any table you like.
|
*/
'table' => 'users',
/*
|--------------------------------------------------------------------------
| Password Reminder Settings
|--------------------------------------------------------------------------
|
| Here you may set the settings for password reminders, including a view
| that should be used as your password reminder e-mail. You will also
| be able to set the name of the table that holds the reset tokens.
|
*/
'reminder' => array(
'email' => 'emails.auth.reminder', 'table' => 'password_reminders',
),
);
?>
【问题讨论】:
我已经告诉了你问题的答案,你想要的就投反对票吧。您的数组键错误,您的登录将一直失败。玩得开心。 你不应该担心否决票,你认为如果尝试了几种组合,那么电子邮件或用户名至少在 laravel4 中不是必需的选项,laravel.com/docs/security。阅读此文档以获得更好的理解...... 我认为您的意思是链接到Laravel 4's documentation. 我现在遇到了类似的问题。一旦我弄清楚了,我会尝试在这里发布。 【参考方案1】:您能显示您的模型的代码吗?为了使 Auth 起作用,这些是 User 模型中应该包含的一些内容。
<?php
use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;
class User extends Eloquent implements UserInterface, RemindableInterface
protected $fillable = array('fname','lname','email','password','create_at','updated_at');
/**
* The database table used by the model.
*
* @var string
*/
protected $table = 'users';
/**
* The attributes excluded from the model's JSON form.
*
* @var array
*/
protected $hidden = array('password');
/**
* Get the unique identifier for the user.
*
* @return mixed
*/
public function getAuthIdentifier()
return $this->getKey();
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
return $this->password;
/**
* Get the e-mail address where password reminders are sent.
*
* @return string
*/
public function getReminderEmail()
return $this->email;
【讨论】:
【参考方案2】:您的代码出错了,因为您将错误的数组键传递给Auth::attempt()
。该方法需要一个带有用户名、密码和可选记住键的数组。鉴于此,您的上述代码应为:
Route::post('login', function()
$credentials = [
'username' => 'admin@email.com',
'password' => 'superSecretPassword'
];
dd(Auth::attempt($credentials));
);
【讨论】:
Auth::attempt 接受一个数据数组,因此该数组是如何生成的几乎无关紧要。是否是硬编码值数组的帖子。 不,没关系,但传递给该方法的 ARRAY KEYS 很重要。您将电子邮件和密码作为密钥传递,但它是“用户名”而不是“电子邮件”。这是正确的答案和解决方案,不知道为什么有人会否决它?! @CreativityKills 人们对你投了反对票,因为你的答案是错误的。根据 L4 文档:“请注意,电子邮件不是必需的选项,它仅用作示例。您应该使用与数据库中的“用户名”相对应的任何列名。”。参考:laravel.com/docs/security#authenticating-users【参考方案3】:我也遇到了一些麻烦。我注意到的是,在我的用户模型中,我有:
protected $softDelete = true;
在数据库中,我有 deleted_at 列,但它默认使用归零的时间戳 - 0000-00-00 00:00:00。这导致找不到记录,进而导致身份验证失败。
我必须修复迁移以正确创建 deleted_at 列,如下所示:
public function up()
Schema::create('users', function($t)
$t->increments('id');
$t->string('first_name');
$t->string('last_name');
$t->string('username');
$t->string('email');
$t->string('password');
$t->softDeletes();
$t->timestamps();
);
这里是关于软删除的文档:http://laravel.com/docs/eloquent#soft-deleting
【讨论】:
【参考方案4】:@eric-evans 是正确的。要在 laravel 4 中使用身份验证,您必须使您的“用户”模型使用 \Illuminate\Auth\UserInterface 接口,并实现方法
public function getAuthIdentifier()
return $this->getKey();
public function getAuthPassword()
return $this->password;
【讨论】:
【参考方案5】:Auth 类需要一个名为 id 的列作为用户表中的主键。
【讨论】:
【参考方案6】:确保您的 数据库中的密码字段有 64 个字符的空间。 varchar(64)
哈希需要 64 个字符,如果您的哈希密码在插入时被截断(因此无法积极验证密码),您不会从 laravel 收到错误。
【讨论】:
(+1) Laravel 没有抛出异常,但这解决了我的问题。 只是想谢谢你。我正用头撞墙试图弄清楚这一点,就这么简单。 (+1) 感谢您节省我的时间。我遇到了同样的问题,并且没有声明密码字段 64 的大小。我认为如果大小小于 64,laravel 必须显示一些错误。可能他们将来会添加这个功能:) 我不知道 Laravel 总是使用哈希来检查密码。谢谢! 在尝试找出我无法登录的原因大约一个小时后,我找到了您的答案。我已将密码设置为 varchar(32),这正是它不起作用的原因。谢谢!【参考方案7】:注意你的用户表,密码字段是散列的,原因是 Auth::attempt($credentials); $credentials->password 评估哈希密码
【讨论】:
【参考方案8】:检查您的密码是否经过哈希处理。它不应该是普通文本..
【讨论】:
以上是关于Laravel 4 Auth:尝试不工作的主要内容,如果未能解决你的问题,请参考以下文章
Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作