代码之家  ›  专栏  ›  技术社区  ›  glembo

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

  •  0
  • glembo  · 技术社区  · 6 年前

    我创建了一个基于laravel的定制电子商务系统。购物车由laravel的会话令牌标识( 会话['\u令牌'] )分为cart表和cartProduct表。整个系统工作正常。

    不幸的是 会话['\u令牌'] 在用户成功登录后立即更改。在此之后,旧会话的整个购物车没有正确识别,因为令牌已更改。

    现在我的问题是:

    • 如何防止Laravel在登录后更改会话['\u令牌']?
    • 这是建议的还是会出现一些安全问题?
    • 如果没有:如何在登录前后将购物车与用户关联?

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

    购物车-桌子 : enter image description here

    cart\u产品-表 : enter image description here

    2 回复  |  直到 6 年前
        1
  •  1
  •   glembo    6 年前

    我找到了一个有效的解决方案。我修改了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());
        }
    

    此代码用新令牌更新旧令牌。

        2
  •  0
  •   Lukas Pierce    6 年前

    尝试登录之前的主idea安全旧会话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();
         }
      
      }