白名单管理页可给单个账号设明文登录口令(users.login_password,可空):
设置后该账号用户名直登(/login/username)须带匹配 ?password=,且优先于全局共享口令门;
未设口令的账号行为不变。前端登录 URL 已支持透传 ?password=,无需改登录页。
- 后端:UserRow/User 新增 login_password + 仓储映射;/login/username 账号级口令闸门
(_lookup_user_by_username 仅查不建);新管理员接口 PUT /users/{id}/login-password;
UserListItem 暴露明文(仅 admin 列表);migration 20260625_04 + 幂等补列 SQL。
- 前端:白名单页新增「登录口令」列(设置/修改/清除 + 复制登录链接);
core/auth api+hooks 增 setUserLoginPassword/useSetUserLoginPassword(含 Y-Log)。
- 文档:根 + 后端 CLAUDE.md 同步。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
49 lines
1.9 KiB
TypeScript
49 lines
1.9 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
|
|
|
import { OptType, writeYLog } from "@/core/log/y-log";
|
|
|
|
import { listAllUsers, setUserApproval, setUserLoginPassword } from "./api";
|
|
|
|
export function useAllUsers(enabled: boolean) {
|
|
return useQuery({
|
|
queryKey: ["admin", "users"],
|
|
queryFn: listAllUsers,
|
|
enabled,
|
|
});
|
|
}
|
|
|
|
/** 放行 / 取消放行某个用户(登录白名单),成功后刷新用户列表缓存。 */
|
|
export function useSetUserApproval() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ userId, approved }: { userId: string; approved: boolean }) => setUserApproval(userId, approved),
|
|
onSuccess: (_data, vars) => {
|
|
writeYLog({
|
|
optType: vars.approved ? OptType.enabled : OptType.disabled,
|
|
optDetail: `CM助手-全量-白名单管理-${vars.approved ? "放行" : "取消放行"}用户`,
|
|
url: `/api/v1/auth/users/${vars.userId}/approval`,
|
|
reqParam: vars,
|
|
});
|
|
void queryClient.invalidateQueries({ queryKey: ["admin", "users"] });
|
|
},
|
|
});
|
|
}
|
|
|
|
/** 设置 / 清除某账号的「登录口令」(明文),成功后刷新用户列表缓存。 */
|
|
export function useSetUserLoginPassword() {
|
|
const queryClient = useQueryClient();
|
|
return useMutation({
|
|
mutationFn: ({ userId, password }: { userId: string; password: string | null }) => setUserLoginPassword(userId, password),
|
|
onSuccess: (_data, vars) => {
|
|
const cleared = vars.password == null || vars.password === "";
|
|
writeYLog({
|
|
optType: cleared ? OptType.delete : OptType.edit,
|
|
optDetail: `CM助手-全量-白名单管理-${cleared ? "清除" : "设置"}账号登录口令`,
|
|
url: `/api/v1/auth/users/${vars.userId}/login-password`,
|
|
reqParam: { userId: vars.userId },
|
|
});
|
|
void queryClient.invalidateQueries({ queryKey: ["admin", "users"] });
|
|
},
|
|
});
|
|
}
|