管理员权限更新

This commit is contained in:
537yaha
2026-03-31 16:40:29 +08:00
parent 25c7e54648
commit 124e30a7b2
3 changed files with 32 additions and 10 deletions
+8
View File
@@ -73,6 +73,14 @@ docker-compose -f docker-compose.prod.yml up -d
- 用户名:`admin`(或 `.env``ADMIN_USERNAME`
- 密码:`.env``ADMIN_PASSWORD`
#### 演示站管理员安全策略
- `ADMIN_PASSWORD` 仅在首次创建管理员时生效;数据库里已有管理员后,重启服务不会覆盖其密码。
- 出于演示环境安全,前端默认**不允许**:
- 修改 `admin` 账号密码
- 删除任意 `admin` 账号
- 若需维护管理员账号,请直接通过数据库操作(例如重置密码、删除异常管理员)。
#### 端口修改(重要说明)
- 默认端口:前端 `3000`,后端对外 `18080`
+6 -8
View File
@@ -271,15 +271,9 @@ func (s *UserService) DeleteUser(id uint, currentUserID uint) error {
return err
}
// 防止删除最后一个管理员
// 演示站安全策略:管理员账号只能通过数据库维护,接口层禁止删除任何管理员
if user.Role == "admin" {
count, err := s.users.CountByRole("admin")
if err != nil {
return err
}
if count <= 1 {
return errors.New("不能删除最后一个管理员")
}
return errors.New("管理员账号不允许通过前端删除,请使用数据库维护")
}
// 执行删除
@@ -300,6 +294,10 @@ func (s *UserService) UpdateUserPassword(input UpdatePasswordInput) error {
}
return err
}
// 演示站安全策略:管理员密码固定由环境/数据库维护,前端接口不允许改动。
if user.Role == "admin" {
return errors.New("管理员密码不允许通过前端修改,请使用数据库维护")
}
// 验证新密码
if input.NewPassword == "" {
+18 -2
View File
@@ -197,6 +197,10 @@ export default function UsersPage(props: any = {}) {
// 打开修改密码对话框
const handleOpenPassword = (user: UserSummary) => {
if (user.role === "admin") {
toast.error("管理员密码仅支持数据库修改,前端已禁用");
return;
}
setSelectedUser(user);
setPasswordForm({
old_password: "",
@@ -241,6 +245,10 @@ export default function UsersPage(props: any = {}) {
// 打开删除对话框
const handleOpenDelete = (user: UserSummary) => {
if (user.role === "admin") {
toast.error("管理员账号仅支持数据库删除,前端已禁用");
return;
}
setSelectedUser(user);
setDeleteDialogOpen(true);
};
@@ -371,6 +379,8 @@ export default function UsersPage(props: any = {}) {
size="sm"
onClick={() => handleOpenPassword(user)}
className="flex-1"
disabled={user.role === "admin"}
title={user.role === "admin" ? "管理员密码仅支持数据库修改" : ""}
>
<Lock className="w-4 h-4 mr-1" />
@@ -379,8 +389,14 @@ export default function UsersPage(props: any = {}) {
variant="destructive"
size="sm"
onClick={() => handleOpenDelete(user)}
disabled={user.id === agent.id}
title={user.id === agent.id ? "不能删除当前登录用户" : ""}
disabled={user.id === agent.id || user.role === "admin"}
title={
user.role === "admin"
? "管理员账号仅支持数据库删除"
: user.id === agent.id
? "不能删除当前登录用户"
: ""
}
>
<Trash2 className="w-4 h-4" />
</Button>