security: 后台登录态可吊销(令牌版本号) + 清理未使用的 prisma 依赖(依赖漏洞 46→0)

- admin token 载荷新增 ver 版本号,与当前版本不一致即失效;版本持久化到 platform_configs,重启/多实例(30s同步)均生效
- 新增 POST /api/admin/session/revoke-all(requireAdmin):一键吊销全部后台登录态;后台右上角新增入口
- 令牌有效期改为可配置 ADMIN_TOKEN_TTL_HOURS(默认由 7 天收紧到 24 小时)
- 移除 server 未使用的 @prisma/client / prisma(server/src 零引用),pnpm 移除 331 个包;pnpm audit --prod 由 46 个漏洞降为 0
- 新增回归护栏 admin-token-revocation.spec.ts(91 套件/653 用例全绿);冒烟 6/6
这个提交包含在:
xcbyy
2026-10-19 14:08:58 +08:00
父节点 0752acda40
当前提交 12bbf4fc6b
共有 7 个文件被更改,包括 114 次插入 和 3926 次删除

查看文件

@@ -18,6 +18,11 @@ export function logout() {
return axios.post<LoginRes>('/api/user/logout');
}
/** 吊销所有后台登录态(含当前本机),所有已签发 token 立即失效 */
export function revokeAllAdminSessions() {
return axios.post<null>('/api/admin/session/revoke-all');
}
export function getUserInfo() {
return axios.post<UserState>('/api/user/info');
}

查看文件

@@ -177,6 +177,12 @@
</span>
</a-space>
</a-doption>
<a-doption>
<a-space @click="handleRevokeAll">
<icon-lock />
<span>吊销所有后台登录态</span>
</a-space>
</a-doption>
<a-doption>
<a-space @click="handleLogout">
<icon-export />
@@ -200,6 +206,7 @@
import { LOCALE_OPTIONS } from '@/locale';
import useLocale from '@/hooks/locale';
import useUser from '@/hooks/user';
import { revokeAllAdminSessions } from '@/api/user';
import Menu from '@/components/menu/index.vue';
import MessageBox from '../message-box/index.vue';
@@ -247,6 +254,17 @@
const handleLogout = () => {
logout();
};
const handleRevokeAll = async () => {
try {
await revokeAllAdminSessions();
Message.success('已吊销所有后台登录态(含本机),请重新登录');
setTimeout(() => {
logout();
}, 800);
} catch (e: any) {
Message.error(e?.message || '吊销失败,请重试');
}
};
const setDropDownVisible = () => {
const event = new MouseEvent('click', {
view: window,