三方系统密码加密

This commit is contained in:
dengqichen 2025-11-11 14:06:53 +08:00
parent 10e75b9769
commit 3d454a0802
2 changed files with 73 additions and 18 deletions

View File

@ -50,12 +50,8 @@ const DeleteDialog: React.FC<DeleteDialogProps> = ({
onSuccess(); onSuccess();
onOpenChange(false); onOpenChange(false);
} catch (error) { } catch (error) {
// 错误已经在 request 拦截器中显示了,这里只需要记录日志
console.error('删除失败:', error); console.error('删除失败:', error);
toast({
title: '删除失败',
description: error instanceof Error ? error.message : '未知错误',
variant: 'destructive'
});
} }
}; };

View File

@ -40,22 +40,32 @@ const EditDialog: React.FC<EditDialogProps> = ({
authType: 'BASIC' as AuthType, authType: 'BASIC' as AuthType,
}); });
// 保存原始密码和Token用于判断是否被修改
const [originalPassword, setOriginalPassword] = useState<string | undefined>(undefined);
const [originalToken, setOriginalToken] = useState<string | undefined>(undefined);
useEffect(() => { useEffect(() => {
if (open) { if (open) {
if (record) { if (record) {
// 保存原始掩码值
setOriginalPassword(record.password);
setOriginalToken(record.token);
setFormData({ setFormData({
name: record.name, name: record.name,
type: record.type, type: record.type,
url: record.url, url: record.url,
authType: record.authType, authType: record.authType,
username: record.username, username: record.username,
password: undefined, // 不显示密码 password: record.password || '', // 显示掩码或空
token: undefined, token: record.token || '', // 显示掩码或空
sort: record.sort, sort: record.sort,
remark: record.remark, remark: record.remark,
enabled: record.enabled, enabled: record.enabled,
}); });
} else { } else {
setOriginalPassword(undefined);
setOriginalToken(undefined);
setFormData({ enabled: true, sort: 1, authType: 'BASIC' as AuthType }); setFormData({ enabled: true, sort: 1, authType: 'BASIC' as AuthType });
} }
} }
@ -89,36 +99,71 @@ const EditDialog: React.FC<EditDialogProps> = ({
toast({ title: '提示', description: '请输入用户名', variant: 'destructive' }); toast({ title: '提示', description: '请输入用户名', variant: 'destructive' });
return; return;
} }
// 新建时必须输入密码
if (!record && !formData.password) { if (!record && !formData.password) {
toast({ title: '提示', description: '请输入密码', variant: 'destructive' }); toast({ title: '提示', description: '请输入密码', variant: 'destructive' });
return; return;
} }
// 编辑时,如果清空了原有密码(掩码),也需要输入新密码
if (record && originalPassword === '********' && !formData.password?.trim()) {
toast({ title: '提示', description: '请输入新密码或保持原密码不变', variant: 'destructive' });
return;
}
} }
if (formData.authType === 'TOKEN') { if (formData.authType === 'TOKEN') {
// 新建时必须输入Token
if (!record && !formData.token) { if (!record && !formData.token) {
toast({ title: '提示', description: '请输入访问令牌', variant: 'destructive' }); toast({ title: '提示', description: '请输入访问令牌', variant: 'destructive' });
return; return;
} }
// 编辑时如果清空了原有Token掩码也需要输入新Token
if (record && originalToken === '********' && !formData.token?.trim()) {
toast({ title: '提示', description: '请输入新令牌或保持原令牌不变', variant: 'destructive' });
return;
}
}
// 准备提交数据
const submitData: ExternalSystemRequest = {
...formData as ExternalSystemRequest,
};
// 处理密码:如果用户没有修改,保持掩码;如果修改了,提交新值
if (formData.authType === 'BASIC') {
if (record && formData.password === originalPassword) {
// 没有修改,保持掩码
submitData.password = originalPassword;
} else {
// 修改了或新建,提交新密码
submitData.password = formData.password;
}
}
// 处理Token如果用户没有修改保持掩码如果修改了提交新值
if (formData.authType === 'TOKEN') {
if (record && formData.token === originalToken) {
// 没有修改,保持掩码
submitData.token = originalToken;
} else {
// 修改了或新建提交新Token
submitData.token = formData.token;
}
} }
if (record) { if (record) {
await updateExternalSystem(record.id, formData as ExternalSystemRequest); await updateExternalSystem(record.id, submitData);
toast({ title: '更新成功', description: `系统 "${formData.name}" 已更新` }); toast({ title: '更新成功', description: `系统 "${formData.name}" 已更新` });
} else { } else {
await createExternalSystem(formData as ExternalSystemRequest); await createExternalSystem(submitData);
toast({ title: '创建成功', description: `系统 "${formData.name}" 已创建` }); toast({ title: '创建成功', description: `系统 "${formData.name}" 已创建` });
} }
onSuccess(); onSuccess();
onOpenChange(false); onOpenChange(false);
} catch (error) { } catch (error) {
// 错误已经在 request 拦截器中显示了,这里只需要记录日志
console.error('保存失败:', error); console.error('保存失败:', error);
toast({
title: '保存失败',
description: error instanceof Error ? error.message : '未知错误',
variant: 'destructive'
});
} }
}; };
@ -196,13 +241,20 @@ const EditDialog: React.FC<EditDialogProps> = ({
/> />
</div> </div>
<div className="grid gap-2"> <div className="grid gap-2">
<Label htmlFor="password"> {!record && '*'}</Label> <Label htmlFor="password">
{!record && '*'}
{record && originalPassword === '********' && (
<span className="ml-2 text-xs text-muted-foreground">
()
</span>
)}
</Label>
<Input <Input
id="password" id="password"
type="password" type="password"
value={formData.password || ''} value={formData.password || ''}
onChange={(e) => setFormData({ ...formData, password: e.target.value })} onChange={(e) => setFormData({ ...formData, password: e.target.value })}
placeholder={record ? '不修改请留空' : '请输入密码'} placeholder={record ? (originalPassword === '********' ? '保持不变或输入新密码' : '请输入密码') : '请输入密码'}
/> />
</div> </div>
</> </>
@ -210,13 +262,20 @@ const EditDialog: React.FC<EditDialogProps> = ({
{formData.authType === 'TOKEN' && ( {formData.authType === 'TOKEN' && (
<div className="grid gap-2"> <div className="grid gap-2">
<Label htmlFor="token">访 {!record && '*'}</Label> <Label htmlFor="token">
访 {!record && '*'}
{record && originalToken === '********' && (
<span className="ml-2 text-xs text-muted-foreground">
()
</span>
)}
</Label>
<Input <Input
id="token" id="token"
type="password" type="password"
value={formData.token || ''} value={formData.token || ''}
onChange={(e) => setFormData({ ...formData, token: e.target.value })} onChange={(e) => setFormData({ ...formData, token: e.target.value })}
placeholder={record ? '不修改请留空' : '请输入访问令牌'} placeholder={record ? (originalToken === '********' ? '保持不变或输入新令牌' : '请输入访问令牌') : '请输入访问令牌'}
/> />
</div> </div>
)} )}