我创建了一个基于laravel的自定义电子商务系统。购物车由laravel的会话令牌(会话[' _token'] )标识,并分为购物车表和cartProduct表。整个系统按预期工作。
不幸的是,只要用户成功登录,就会更改会话[' _token'] 。之后,旧会话的整个购物车都无法正确识别,因为令牌已经改变。
现在我的问题:
如果您需要有关系统的更多信息,请在评论中告诉我,我将为您提供详细信息。
答案 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
更改路线中的操作名称
Route::post("/login", 'LoginController@doLogin');
修改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();
}
}