Laravel 5.6 - 在自定义上使用内置 Auth table - 不进行身份验证 user/password
Laravel 5.6 - Using built in Auth on custom table - Not authenticating user/password
我正在努力使用 Laravel 的内置身份验证来对抗已经包含用户名和密码的现有 'Users' table。列名是 'UserEmail' 和 'UserPassword'。为了测试它,我使用 tinker 创建了一个条目,将密码散列为:
$user->UserPassword=Hash::make('1234');
尝试使用 Auth::attempt
登录时,身份验证一直失败。为了进行调试,我开始添加 var_dump
,甚至将通过的密码请求与数据库中的散列密码进行比较,结果匹配。所以我不确定为什么 Auth::attempt
无法验证它:
这是我在 LoginController.php:
中的功能
public function login(Request $request)
{
// validate the form data
$this->validate($request, [
'UserEmail' => 'required',
'UserPassword' => 'required'
]);
var_dump($request->UserEmail);
var_dump($request->UserPassword);
$user = App\FarmUser::where('UserEmail', $request->UserEmail)->first();
var_dump($user->UserPassword);
$authenticated = Hash::check($request->UserPassword, $user->UserPassword);
var_dump($authenticated);
// attempt to log the user in
if (Auth::attempt(['UserEmail' => $request->UserEmail, 'UserPassword' => $request->UserPassword], $request->remember)) {
// if successful, then redirect to their intended location
Debugbar::addMessage('successfully authenticated');
return redirect()->intended($redirectTo);
}
// if unsuccessful, then redirect back to login with the form data
Debugbar::addMessage('authentication failed');
//return redirect()->back();
}
当我尝试登录时,我看到正确的 UserEmail、UserPassword,并且哈希检查也 returns 正确。但是,当我调用 Auth::attempt
时,它没有成功验证并重定向回来。知道为什么我无法让 Auth::attempt
正确验证吗?
当我登录时,这是从那些 var 转储生成的输出:
string(20) "user@test.com" string(8) "1234" string(60) "<hash>" bool(true)
这是 returns 为这个 App\FarmUser 模型所做的修改:
>>> $user = App\FarmUser::where('UserLogin', 'testuser')->first();
=> App\FarmUser {#809
ID: 1,
UserLogin: "testuser",
password: "<hash>",
Active: "Yes",
UserEmail: "user@test.com",
Created: "2018-03-20 15:09:24",
CreatedByID: null,
Modified: null,
ModifiedByID: null,
created_at: "2018-03-20 19:09:09",
updated_at: "2018-03-20 19:09:09",
}
您需要重写用户模型中的 getAuthPassword()
方法,如下所示:
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->UserPassword;
}
并且不要在 Auth::attempt()
中调用 UserPassword
,而是调用 password
。像这样:
Auth::attempt([
'UserEmail' => $request->UserEmail,
'password' => $request->UserPassword
]);
这是因为 Laravel 无法识别哪些字段应该是 password
字段并且有一个 "reserved" 词 "password" (它将执行哈希在那个领域,而不是其他领域)。
编辑:
由于你的模型实际上是\App\FarmUser
,你还需要在config/auth.php
文件中改变它,像这样:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\FarmUser::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
我正在努力使用 Laravel 的内置身份验证来对抗已经包含用户名和密码的现有 'Users' table。列名是 'UserEmail' 和 'UserPassword'。为了测试它,我使用 tinker 创建了一个条目,将密码散列为:
$user->UserPassword=Hash::make('1234');
尝试使用 Auth::attempt
登录时,身份验证一直失败。为了进行调试,我开始添加 var_dump
,甚至将通过的密码请求与数据库中的散列密码进行比较,结果匹配。所以我不确定为什么 Auth::attempt
无法验证它:
这是我在 LoginController.php:
中的功能public function login(Request $request)
{
// validate the form data
$this->validate($request, [
'UserEmail' => 'required',
'UserPassword' => 'required'
]);
var_dump($request->UserEmail);
var_dump($request->UserPassword);
$user = App\FarmUser::where('UserEmail', $request->UserEmail)->first();
var_dump($user->UserPassword);
$authenticated = Hash::check($request->UserPassword, $user->UserPassword);
var_dump($authenticated);
// attempt to log the user in
if (Auth::attempt(['UserEmail' => $request->UserEmail, 'UserPassword' => $request->UserPassword], $request->remember)) {
// if successful, then redirect to their intended location
Debugbar::addMessage('successfully authenticated');
return redirect()->intended($redirectTo);
}
// if unsuccessful, then redirect back to login with the form data
Debugbar::addMessage('authentication failed');
//return redirect()->back();
}
当我尝试登录时,我看到正确的 UserEmail、UserPassword,并且哈希检查也 returns 正确。但是,当我调用 Auth::attempt
时,它没有成功验证并重定向回来。知道为什么我无法让 Auth::attempt
正确验证吗?
当我登录时,这是从那些 var 转储生成的输出:
string(20) "user@test.com" string(8) "1234" string(60) "<hash>" bool(true)
这是 returns 为这个 App\FarmUser 模型所做的修改:
>>> $user = App\FarmUser::where('UserLogin', 'testuser')->first();
=> App\FarmUser {#809
ID: 1,
UserLogin: "testuser",
password: "<hash>",
Active: "Yes",
UserEmail: "user@test.com",
Created: "2018-03-20 15:09:24",
CreatedByID: null,
Modified: null,
ModifiedByID: null,
created_at: "2018-03-20 19:09:09",
updated_at: "2018-03-20 19:09:09",
}
您需要重写用户模型中的 getAuthPassword()
方法,如下所示:
/**
* Get the password for the user.
*
* @return string
*/
public function getAuthPassword()
{
return $this->UserPassword;
}
并且不要在 Auth::attempt()
中调用 UserPassword
,而是调用 password
。像这样:
Auth::attempt([
'UserEmail' => $request->UserEmail,
'password' => $request->UserPassword
]);
这是因为 Laravel 无法识别哪些字段应该是 password
字段并且有一个 "reserved" 词 "password" (它将执行哈希在那个领域,而不是其他领域)。
编辑:
由于你的模型实际上是\App\FarmUser
,你还需要在config/auth.php
文件中改变它,像这样:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\FarmUser::class,
],
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],