mirror of
https://github.com/2930134478/AI-CS.git
synced 2026-06-15 00:44:30 +08:00
管理员权限更新
This commit is contained in:
@@ -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`
|
||||
|
||||
@@ -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 == "" {
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user