Просмотр исходного кода

fix: last admin shouldn't be deleted, disabled or demoted

Tao Chen 1 год назад
Родитель
Сommit
aee25a6c99
1 измененных файлов с 27 добавлено и 0 удалено
  1. 27 0
      service/user.go

+ 27 - 0
service/user.go

@@ -184,6 +184,10 @@ func (us *UserService) Logout(u *model.User, token string) error {
184 184
 
185 185
 // Delete 删除用户和oauth信息
186 186
 func (us *UserService) Delete(u *model.User) error {
187
+	userCount := us.getAdminUserCount()
188
+	if userCount <= 1 {
189
+		return errors.New("The last admin user cannot be deleted")
190
+	}
187 191
 	tx := global.DB.Begin()
188 192
 	// 删除用户
189 193
 	if err := tx.Delete(u).Error; err != nil {
@@ -221,6 +225,15 @@ func (us *UserService) Delete(u *model.User) error {
221 225
 
222 226
 // Update 更新
223 227
 func (us *UserService) Update(u *model.User) error {
228
+	currentUser := us.InfoById(u.Id)
229
+	// 如果当前用户是管理员并且 IsAdmin 不为空,进行检查
230
+	if currentUser.IsAdmin != nil && *currentUser.IsAdmin {
231
+		adminCount := us.getAdminUserCount()
232
+		// 如果这是唯一的管理员,确保不能禁用或取消管理员权限
233
+		if adminCount <= 1 && (u.IsAdmin == nil || !*u.IsAdmin || u.Status == model.COMMON_STATUS_DISABLED) {
234
+			return errors.New("The last admin user cannot be disabled or demoted")
235
+		}
236
+	}
224 237
 	return global.DB.Model(u).Updates(u).Error
225 238
 }
226 239
 
@@ -418,4 +431,18 @@ func (us *UserService) formatUsername(username string) string {
418 431
 	username = strings.ReplaceAll(username, " ", "")
419 432
 	username = strings.ToLower(username)
420 433
 	return username
434
+}
435
+
436
+//  Helper functions, getUserCount
437
+func (us *UserService) getUserCount() int64 {
438
+	var count int64
439
+	global.DB.Model(&model.User{}).Count(&count)
440
+	return count
441
+}
442
+
443
+// helper functions, getAdminUserCount
444
+func (us *UserService) getAdminUserCount() int64 {
445
+	var count int64
446
+	global.DB.Model(&model.User{}).Where("is_admin = ?", true).Count(&count)
447
+	return count
421 448
 }