update
This commit is contained in:
@@ -138,3 +138,4 @@ dist
|
|||||||
*.jpg
|
*.jpg
|
||||||
/packages/backend/uploads/backgrounds
|
/packages/backend/uploads/backgrounds
|
||||||
/temp_iterm_schemes
|
/temp_iterm_schemes
|
||||||
|
/packages/backend/sessions
|
||||||
|
|||||||
@@ -118,12 +118,11 @@ export const login = async (req: Request, res: Response): Promise<void> => {
|
|||||||
|
|
||||||
// 根据 rememberMe 设置 cookie maxAge
|
// 根据 rememberMe 设置 cookie maxAge
|
||||||
if (rememberMe) {
|
if (rememberMe) {
|
||||||
// 如果记住我,使用默认的 maxAge (在 index.ts 中设置,通常是 7 天)
|
// 如果勾选了“记住我”,设置 cookie 有效期为 1 年 (毫秒)
|
||||||
// 如果需要强制覆盖为 7 天,取消下一行注释
|
req.session.cookie.maxAge = 31536000000; // 1 year = 365 * 24 * 60 * 60 * 1000
|
||||||
// req.session.cookie.maxAge = 1000 * 60 * 60 * 24 * 7;
|
|
||||||
} else {
|
} else {
|
||||||
// 如果不记住我,设置为会话 cookie (浏览器关闭时过期)
|
// 如果未勾选,则不设置 maxAge,使其成为会话 cookie
|
||||||
req.session.cookie.maxAge = undefined; // 使用 undefined 表示会话 cookie
|
req.session.cookie.maxAge = undefined; // 或者 null
|
||||||
}
|
}
|
||||||
|
|
||||||
res.status(200).json({
|
res.status(200).json({
|
||||||
@@ -250,11 +249,11 @@ export const verifyLogin2FA = async (req: Request, res: Response): Promise<void>
|
|||||||
|
|
||||||
// 根据之前存储在 session 中的 rememberMe 设置 cookie maxAge
|
// 根据之前存储在 session 中的 rememberMe 设置 cookie maxAge
|
||||||
if (req.session.rememberMe) {
|
if (req.session.rememberMe) {
|
||||||
// 如果记住我,使用默认的 maxAge
|
// 如果勾选了“记住我”,设置 cookie 有效期为 1 年 (毫秒)
|
||||||
// req.session.cookie.maxAge = 1000 * 60 * 60 * 24 * 7;
|
req.session.cookie.maxAge = 31536000000; // 1 year
|
||||||
} else {
|
} else {
|
||||||
// 如果不记住我,设置为会话 cookie
|
// 如果未勾选,则不设置 maxAge,使其成为会话 cookie
|
||||||
req.session.cookie.maxAge = undefined;
|
req.session.cookie.maxAge = undefined; // 或者 null
|
||||||
}
|
}
|
||||||
// 清除临时的 rememberMe 状态
|
// 清除临时的 rememberMe 状态
|
||||||
delete req.session.rememberMe;
|
delete req.session.rememberMe;
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ app.set('trust proxy', true);
|
|||||||
// const SQLiteStore = connectSqlite3(session); // 移除旧的 Store 初始化
|
// const SQLiteStore = connectSqlite3(session); // 移除旧的 Store 初始化
|
||||||
// 使用 process.cwd() 获取项目根目录,然后拼接路径,确保路径一致性
|
// 使用 process.cwd() 获取项目根目录,然后拼接路径,确保路径一致性
|
||||||
// console.log('[Index CWD 1]', process.cwd()); // 移除调试日志
|
// console.log('[Index CWD 1]', process.cwd()); // 移除调试日志
|
||||||
const dbPath = path.join(process.cwd(), 'data'); // Correct path relative to CWD (packages/backend)
|
// const dbPath = path.join(process.cwd(), 'data'); // 移除未使用的变量
|
||||||
|
|
||||||
// --- 中间件 ---
|
// --- 中间件 ---
|
||||||
// !! 重要:IP 白名单应尽可能早地应用,通常在其他中间件之前 !!
|
// !! 重要:IP 白名单应尽可能早地应用,通常在其他中间件之前 !!
|
||||||
@@ -132,7 +132,7 @@ const startServer = () => {
|
|||||||
const sessionMiddleware = session({
|
const sessionMiddleware = session({
|
||||||
store: new FileStore({
|
store: new FileStore({
|
||||||
path: sessionsPath, // 指定会话文件存储目录
|
path: sessionsPath, // 指定会话文件存储目录
|
||||||
ttl: 60 * 60 * 24 * 7, // 会话有效期 (秒),7天,匹配 cookie maxAge (需要秒)
|
ttl: 31536000, // 会话有效期 (秒),设置为 1 年,确保服务器端会话数据长期存在
|
||||||
// logFn: (message) => { console.log('[SessionFileStore]', message); } // 移除调试日志
|
// logFn: (message) => { console.log('[SessionFileStore]', message); } // 移除调试日志
|
||||||
// reapInterval: 3600 // 清理过期会话间隔 (秒),默认1小时
|
// reapInterval: 3600 // 清理过期会话间隔 (秒),默认1小时
|
||||||
}),
|
}),
|
||||||
@@ -140,7 +140,7 @@ const startServer = () => {
|
|||||||
resave: false,
|
resave: false,
|
||||||
saveUninitialized: false,
|
saveUninitialized: false,
|
||||||
cookie: {
|
cookie: {
|
||||||
maxAge: 1000 * 60 * 60 * 24 * 7,
|
// maxAge: 1000 * 60 * 60 * 24 * 7, // 移除固定的 cookie maxAge,默认为会话期
|
||||||
httpOnly: true,
|
httpOnly: true,
|
||||||
secure: process.env.NODE_ENV === 'production'
|
secure: process.env.NODE_ENV === 'production'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ const handleSubmit = async () => {
|
|||||||
<!-- 新增:记住我复选框 -->
|
<!-- 新增:记住我复选框 -->
|
||||||
<div class="form-group form-group-checkbox">
|
<div class="form-group form-group-checkbox">
|
||||||
<input type="checkbox" id="rememberMe" v-model="rememberMe" :disabled="isLoading" />
|
<input type="checkbox" id="rememberMe" v-model="rememberMe" :disabled="isLoading" />
|
||||||
<label for="rememberMe">{{ t('login.rememberMe') }}</label>
|
<label for="rememberMe">记住我</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user