Laravel会话表user_id始终为null

时间:2016-09-14 11:05:18

标签: php laravel

我尝试设置会话,但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'));
    }



}

4 个答案:

答案 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_idGuard设置为当前登录的用户。但是,由于您未使用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"
]