Laravel 5.6购物车基于会话令牌认证问题

时间:2018-04-17 08:41:56

标签: php laravel session authentication shopping-cart

我创建了一个基于laravel的自定义电子商务系统。购物车由laravel的会话令牌(会话[' _token'] )标识,并分为购物车表和cartProduct表。整个系统按预期工作。

不幸的是,只要用户成功登录,就会更改会话[' _token'] 。之后,旧会话的整个购物车都无法正确识别,因为令牌已经改变。

现在我的问题:

  • 如何在登录后阻止Laravel更改会话[' _token']?
  • 这是否可以推荐或者是否会出现一些安全问题?
  • 如果没有:如何在登录前后将购物车与用户联系起来?

如果您需要有关系统的更多信息,请在评论中告诉我,我将为您提供详细信息。

购物车 - 表格enter image description here

cart_products - 表格enter image description here

2 个答案:

答案 0 :(得分:0)

我找到了一个有效的解决方案。我修改了LoginController并根据我的需要更新了sendLoginResponse方法:

protected function sendLoginResponse(Request $request)
    {
        // save old session token (shopping cart is related to this one)

        $old_session_token = session()->get('_token');

        // regenerate new session (prevent session fixation)
        $request->session()->regenerate();

        // get new session token
        $new_session_token = session()->get('_token');

        // update session token in cart table

        $shopping_cart = Cart::where('session_token', $old_session_token)->first();

        $shopping_cart->session_token = $new_session_token;

        $shopping_cart->save();

        $this->clearLoginAttempts($request);

        return $this->authenticated($request, $this->guard()->user())
            ?: redirect()->intended($this->redirectPath());
    }

此代码使用新代码更新旧代码。

答案 1 :(得分:0)

尝试登录前的主要想法安全的旧会话ID

  1. 更改路线中的操作名称

    Route::post("/login", 'LoginController@doLogin');
    
  2. 修改LoginController

    class LoginController extends Controller {
    
       use AuthenticatesUsers;
    
       private $old_session_id;
    
       public function doLogin(Request $request) {
         //remember old session id
         $this->old_session_id = $request->session()->getId();
    
         //call AuthenticatesUsers trait method
         return $this->login($request);
       }
    
       //override trait method
       protected function authenticated(Request $request, $user) {
          //sync cart
          $cart = Cart::whereSessionId($this->old_session_id)->first();
       }
    
    }
    
相关问题