-
Notifications
You must be signed in to change notification settings - Fork 6
Description
版本信息(Version)
4.2507.0
问题描述(Describe)
- 访问工作台出错
截图或日志(Log)
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是否相同,避免用户存在与否判断错误