在AccountController這個(gè)控制器里面的代碼,session這個(gè)函數(shù)讀取session里面的緩存驗(yàn)證碼時(shí),無(wú)法讀取
runtime和vendor目錄已經(jīng)給了寫入權(quán)限了,并且runtime目錄的session確實(shí)是已經(jīng)生成了session的緩存
我這邊打印看了一下,session這個(gè)函數(shù)里面沒(méi)有captcha-login這個(gè)參數(shù)
看了一下session工具的運(yùn)行原理是從請(qǐng)求頭里面的cookie里面拿到PHPSID來(lái)進(jìn)行獲取緩存數(shù)據(jù)然后進(jìn)行比對(duì),但我的瀏覽器卻是每一次請(qǐng)求都是一個(gè)全新的PHPSID
主要問(wèn)題是nginx的proxy_cookie_path / "/; HttpOnly; SameSite=strict";配置不能有secure參數(shù),這個(gè)參數(shù)只有https協(xié)議才能傳遞cookie
代碼文件:plugin/admin/app/controller/common/AccountController.php
public function login(Request $request){
$captcha = $request->post('captcha');
print_r(session());
if (strtolower($captcha) !== session('captcha-login')) {
return $this->json(1, '驗(yàn)證碼錯(cuò)誤');
}
$request->session()->forget('captcha-login');
$username = $request->post('username', '');
$password = $request->post('password', '');
if (!$username) {
return $this->json(1, '用戶名不能為空');
}
$this->checkLoginLimit($username);
$admin = Admin::where('username', $username)->first();
if (!$admin || !Util::passwordVerify($password, $admin->password)) {
return $this->json(1, '賬戶不存在或密碼錯(cuò)誤');
}
$this->removeLoginLimit($username);
$admin = $admin->toArray();
$session = $request->session();
unset($admin['password']);
$admin['roles'] = $admin['roles'] ? explode(',', $admin['roles']) : [];
$session->set('admin', $admin);
return $this->json(0, '登錄成功', [
'nickname' => $admin['nickname'],
'token' => $request->sessionId(),
]);
}