Files
deerflow-code/frontend-web/src/core/auth/hooks.ts
T
吉鑫升andClaude Opus 4.8 9572b66ecb feat(白名单): 账号级登录口令——管理员设明文口令,用户凭 /login/<用户名>?password= 直登
白名单管理页可给单个账号设明文登录口令(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>
2026-06-27 11:03:39 +08:00

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"] });
},
});
}