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
这个提交包含在:
@@ -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,
|
||||
|
||||
在新工单中引用
屏蔽一个用户