信息
您可以轻松更改数据库中的所有其他字段并将它们用于身份验证。唯一的问题是 password 字段。
事实上,password 字段在 Laravel 中以某种方式硬编码(但不是许多人认为的方式),因此您不能只在传递问题时传递数组。
默认情况下,如果您以这种方式将数组传递给 attempt(可能还有其他 Auth 函数,例如 validate 或 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文件中