我尝试设置会话,但user_id
列始终为null
。其他专栏正常工作。是user_id
保留的吗?这发生在任何人身上吗?
我在这里尝试的是验证用户,将数据保存到会话并重定向到仪表板。
这是代码:
public function login(Request $request)
{
$validator = validator::make($request->all(),[
'username' => 'required',
'password' => 'required'
]);
if($validator->fails()){
return redirect('/')
->withInput()
->withErrors($validator);
}
$username = $request->get('username');
$user = User::where('username', $username)->first();
$checkpass = false;
if(!empty($user)){
$password = $request->get('password');
$dbpass = $user->getAttributes()['pass'];
$checkpass = Hash::check($password, $dbpass);
if($checkpass){
//saving session after success login check
$request->session()->put('id',\Session::getId());
$request->session()->put('user_id', $user->id);
$request->session()->put('ip_address', $request->ip());
$request->session()->put('user_agent', $request->header('User-Agent'));
$request->session()->put('payload', base64_encode($request->getContent()));
$request->session()->put('last_activity', time());
//redirect to dashboard
return redirect('/dashboard');
}
}
if(empty($user) || $checkpass == false){
$errors = new MessageBag(['password'=>['Email and/or password invalid.']]);
return redirect('/')
->withErrors($errors)
->withInput(Input::except('password'));
}
}
答案 0 :(得分:2)
您正在使用database
会话驱动程序。因此,Laravel将通过Illuminate\Session\DatabaseSessionHandler.php
处理会话。如果您查看源代码,您将找到一个方法getDefaultPayload
,只要您write/save
与数据库进行会话,就会调用该方法。
在这个方法中你会发现:
if ($container->bound(Guard::class)) {
$payload['user_id'] = $container->make(Guard::class)->id();
}
通过Laravel' user_id
将Guard
设置为当前登录的用户。但是,由于您未使用Guard
登录,因此此方法会将当前用户ID视为null
,这就是您始终获得null
的原因。
此外,事实上,您设置的所有属性实际上都没有设置。相反,它们都是在getDefaultPayload
的{{1}}方法中设置的。
这是您应该开始确定将Laravel数据库会话与您的实现集成的最佳方法。由于我没有关于您的应用程序的更多信息,我无法为您提供进一步的指导,因为最佳解决方案可能是什么以及最佳变化是什么。虽然不知道任何事情,但我可能会考虑将您的登录系统与Laravel Guard集成,因为它确实提供了一些其他功能。或者,更快的解决方案可能是直接修改DatabaseSessionHandler.php
方法的这一部分。
答案 1 :(得分:0)
您可以在Illuminate \ Session \ DatabaseSessionHandler.php下进行此操作
protected function performUpdate($sessionId, $payload)
{
if(!Auth::check())
{
unset($payload['user_id']);
}
return $this->getQuery()->where('id', $sessionId)->update($payload);
}
答案 2 :(得分:0)
如果您使用Auth::attempt
,它将解决,因为尝试Auth外观laravel将在会话表/文件/ etc上设置user_id,如下所示:
if(Auth::attempt([
'email' => $email,
'password' => $password
])) {
$user = Auth::user();
return [
'user' => $user,
];
}
答案 3 :(得分:0)
尝试进行一些更改Illuminate\Session\DatabaseSessionHandler.php
/**
* Add the user information to the session payload.
*
* @param array $payload
* @return $this
*/
protected function addUserInformation(&$payload)
{
if ($this->container->bound(Guard::class)) {
$payload['user_id'] = $this->userId();
}
// UPDATE "user_id" IN TABLE "sessions" USING YOUR OWN SESSION DATA [BEGIN]
if(\Session::has('login_id')){
$my_user = \Session::get('login_id');
$payload['user_id'] = $my_user;
}
// UPDATE "user_id" IN TABLE "sessions" USING YOUR OWN SESSION DATA [END]
return $this;
}
但是请确保首先由您自己的身份验证功能创建了登录会话。
我的应用程序的示例dd(Session::all);
:
array:8 [
"_token" => "VSI617e5HjtrYnj59hGPG9AS0R7y5vvUA1fQ7mV6"
"language" => "EN"
"_previous" => array:1 []
"_flash" => array:2 []
"login_id" => "123"
]