Skip to content

特定用户名称访问工作台失败 #515

@LordofAvernus

Description

@LordofAvernus

版本信息(Version)

4.2507.0

问题描述(Describe)

  • 访问工作台出错

截图或日志(Log)

Image

2025-08-21 16:53:01 INFO caller=helper.go:66 biz.cloudbeaver=trigger login cloudbeaver, name: adm 2025-08-21 16:53:01 DEBUG caller=log_wrapper.go:214 module=gorm msg=trace: begin:2025-08-21 16:53:01; elapsed:1.547757ms; sql: SELECT * FROMcloudbeaver_user_cachesWHERE cloudbeaver_user_id = 'dms-adm'; rowsAffected: 0; err: <nil> 2025-08-21 16:53:01 ERROR caller=helper.go:101 biz.cloudbeaver=sync cloudbeaver user adm info failed: update cloudbeaver user failed: graphql: Error setting user credentials: Error saving user credentials in database 2025-08-21 16:53:01 DEBUG caller=log_wrapper.go:214 module=gorm msg=trace: begin:2025-08-21 16:53:01; elapsed:1.62907ms; sql: SELECT * FROMusersWHERE uid = '20250821164149872' ANDusers.delete_atIS NULL ORDER BYusers.uidLIMIT 1; rowsAffected: 1; err: <nil> 2025-08-21 16:53:01 INFO caller=helper.go:66 biz.cloudbeaver=trigger login cloudbeaver, name: adm 2025-08-21 16:53:01 DEBUG caller=log_wrapper.go:214 module=gorm msg=trace: begin:2025-08-21 16:53:01; elapsed:1.347889ms; sql: SELECT * FROMcloudbeaver_user_cachesWHERE cloudbeaver_user_id = 'dms-adm'; rowsAffected: 0; err: <nil> 2025-08-21 16:53:01 ERROR caller=helper.go:101 biz.cloudbeaver=sync cloudbeaver user adm info failed: update cloudbeaver user failed: graphql: Error setting user credentials: Error saving user credentials in database

如何复现(To Reproduce)

  • 平台中任意已经存在的用户(如:admin)并且通过工作台访问一次后
  • 新建一个用户,名称为刚才用户的子集(如:admi)
  • 使用新增用户admi访问工作台就会报错

问题原因

  • 新增CB用户的场景下,先查询用户是否存在,由于是模糊查询误以为用户已经存在,所以走了更新用户记录逻辑导致报错
func (cu *CloudbeaverUsecase) createUserIfNotExist(ctx context.Context, cloudbeaverUserId string, dmsUser *User) error {
	....
    // 问题原因!!! 该方法为模糊查询
	checkExistReq := cloudbeaver.NewRequest(cu.graphQl.IsUserExistQuery(cloudbeaverUserId))
	cloudbeaverUserList := UserList{}
	err = graphQLClient.Run(ctx, checkExistReq, &cloudbeaverUserList)
	if err != nil {
		return fmt.Errorf("check cloudbeaver user exist failed: %v", err)
	}

	// 用户不存在则创建CloudBeaver用户
	if len(cloudbeaverUserList.ListUsers) == 0 {
		// 创建用户
		....

		// 授予角色(不授予角色的用户无法登录)
		....
	} else { 
               // 查询数据库中的用户记录 
		cloudbeaverUser, exist, err := cu.repo.GetCloudbeaverUserByID(ctx, cloudbeaverUserId)
		if err != nil {
			return err
		}

		if exist && cloudbeaverUser.DMSFingerprint == cu.userUsecase.GetUserFingerprint(dmsUser) {
			return nil
		}
	}

	// 设置CloudBeaver用户密码 (具体报错位置)
	updatePasswordReq := cloudbeaver.NewRequest(cu.graphQl.UpdatePasswordQuery(), map[string]interface{}{
		"userId": cloudbeaverUserId,
		"credentials": model.JSON{
			"password": strings.ToUpper(aes.Md5(dmsUser.Password)),
		},
	})
	err = graphQLClient.Run(ctx, updatePasswordReq, nil)
	if err != nil {
		return fmt.Errorf("update cloudbeaver user failed: %v", err)
	}
       ...
}

解决方案

在模糊查询结果中对比用户id是否相同,避免用户存在与否判断错误

变更影响面

受影响的模块或功能

外部引用的潜在问题或风险

版本兼容性

测试建议

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingverified已经由测试验证过的issue

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions