Procházet zdrojové kódy

管理员权限更新

537yaha před 4 měsíci
rodič
revize
124e30a7b2
3 změnil soubory, kde provedl 32 přidání a 10 odebrání
  1. 8 0
      README.md
  2. 6 8
      backend/service/user_service.go
  3. 18 2
      frontend/app/agent/users/page.tsx

+ 8 - 0
README.md

@@ -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
backend/service/user_service.go

@@ -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
frontend/app/agent/users/page.tsx

@@ -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>