信息
您可以轻松更改数据库中的所有其他字段并将它们用于身份验证。唯一的问题是password
字段。
事实上password
,字段在 Laravel 中以某种方式硬编码(但不是许多人认为的方式),因此您不能在传递问题时只传递数组。
默认情况下,如果您以这种方式将数组传递给attempt
(可能还有其他 Auth 函数,如validate
or once
):
Auth::attempt(array(
'user_name' => 'admin',
'password' => 'hardpass',
));
默认的 Eloquent 驱动程序将运行以下查询:
select * from `users` where `user_name` = 'admin' limit 1;
从数据库中获取此数据后,它会将您提供的密码与创建的用户对象的密码属性进行比较。
但是,如果您只是使用:
Auth::attempt(array(
'user_name' => 'admin',
'passwd' => 'hardpass',
));
将运行以下查询:
select * from `users` where `user_name` = 'admin' and `passwd` = 'hardpass' limit 1;
并且不会在数据库中找到用户(在passwd
您存储散列密码中)。这是因为 Eloquent 从查询中移除,password
但使用任何其他数据来运行查询。此外,如果您尝试在这里使用'passwd' => Hash:make($data['password'])
虽然会找到用户,但比较密码将不起作用。
解决方案
解决方法很简单。你需要Auth::attempt
像这样运行:
Auth::attempt(array(
'user_name' => 'admin',
'password' => 'hardpass',
));
如您所见,您仍然password
作为键传递(尽管此列不会在users
表中退出),因为只有这样 Eloquent 驱动程序才会使用它来构建查询。
现在在User
模型(app/models/User.php
)文件中,您需要添加以下函数:
public function getAuthPassword() {
return $this->passwd;
}
如您所见,您在这里使用了数据库中真正存在的列:passwd
.
以这种方式使用它,您可以将带有密码的列命名为您想要的任何名称,并且您仍然可以使用默认的 Eloquent 驱动程序。
要测试的样本数据
我为它创建了非常简单的测试。
您只需将app/routes.php
文件替换为以下内容:
Route::get('/', function () {
if (Auth::check()) {
echo "I'm logged in as " . Auth::user()->user_name . "<br />";
echo "<a href='/logout'>Log out</a>";
} else {
echo "I'm NOT logged in<br />";
Auth::attempt(array(
'user_name' => 'admin',
'password' => 'hardpass',
));
if (Auth::check()) {
echo "Now I'm logged in as " . Auth::user()->user_name . "<br />";
echo "<a href='/logout'>Log out</a>";
} else {
echo "I'm still NOT logged in<br />";
}
}
});
Route::get('/logout', function () {
Auth::logout();
return "You have been logged out";
});
Route::get('/db', function () {
if (!Schema::hasTable('users')) {
Schema::create('users', function ($table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('user_name', 60)->unique();
$table->string('passwd', 256);
$table->rememberToken();
$table->timestamps();
});
DB::table('users')->insert(
[
[
'user_name' => 'admin',
'passwd' => Hash::make('hardpass'),
]
]
);
}
echo "Table users has been created";
});
- 创建空数据库并设置连接数据
app/config/database.php
- 现在您可以运行
/db
url 例如http://localhost/yourprojectname/db
创建用户表。
- 现在您可以运行
/
url 例如http://localhost/yourprojectname/
- 正如您看到的用户已登录,即使users
在数据库中的表中您没有任何password
列(用于身份验证的数据已作为字符串传递,没有任何形式,但当然在实际应用程序中您将添加它们) . 您可以再次运行此网址 - 正如您所看到的用户仍被记录,因此它按预期工作。
- 如果您点击
Log out
链接,您将被注销
Laravel 5 对上述内容的更改
该解决方案已在 Larave 4.2.9(如上)和 Laravel 5 中进行了测试。在 Laravel5 中,一切都一样,但您当然需要编辑不同路径中的文件:
User
模型在app/User.php
文件中
- 路线在
app/Http/routes.php
文件中
- 数据库配置文件在
config/database.php
文件中