我正在努力寻找原因,但不能。它总是对“别的”失败。我正在使用sqlite
,这是我的代码:
public function doLogin(Request $request)
{
$email = $request['email'];
$password = $request['password'];
if ( Auth::attempt(['email' => $email, 'password' => $password]) )
return redirect()->route('home');
return redirect()->back();
}
Route::post('/doLogin',['as' => 'doLogin', 'uses' => 'Auth\LoginController@doLogin']);
已经打印了变量,这些值与数据库完全相同。
可能的问题原因?
$usuario = \App\User::find(1)->pluck('email', 'password');
return ($usuario);
印刷值:
{ “teste123”: “teste@teste.com”}
另外,如果我试试这个:
public function doLogin(Request $request)
{
$email = $request->input('email');
$password = $request->input('password');
dd($request->all());
}
我明白了:
array:4 [▼
"_token" => "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
"email" => "teste@teste.com"
"password" => "teste123"
"action" => null
]
这是正常的action = null
吗?
答案 0 :(得分:2)
看起来您将密码以明文形式存储在数据库中,这似乎是个问题。您永远不应该这样做,就像您有安全漏洞一样,然后渗透者可以轻松访问您所有用户的密码。
这也似乎是你的Auth::attempt
失败的原因。 Auth::attempt
进入SessionGuard.php,最终从EloquentUserProvider.php调用validateCredentials
。此函数会对给定的密码进行哈希处理,并根据数据库中的内容进行检查。 Laravel希望对数据库中的密码进行哈希处理(默认情况下是bcrypt),因此密码不匹配。它会对$request
中的明文密码进行哈希处理,因此它不再与数据库中的纯文本匹配。
Laravel comes with the command php artisan make:auth
.如果您使用此功能,那么您不必执行doLogin
功能。您只需沿默认路由发送登录信息即可。然后,当您进行测试时,请通过注册注册您的帐户,以确保它以散列形式保存在您的数据库中,而不是明文。