Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions internal/apiserver/service/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -532,6 +532,9 @@ func (s *APIServer) installController() error {
}
s.SqlWorkbenchController.SqlWorkbenchService.SetSqlResultMasker(masker)

// 策略 B:DMS 删用户时清理 SqlWorkbench 缓存/会话并禁用 ODC 对应用户
s.DMSController.DMS.UserUsecase.SetSqlWorkbenchLifecycle(s.SqlWorkbenchController.SqlWorkbenchService)

// s.AuthController.RegisterPlugin(s.DMSController.GetRegisterPluginFn())
return nil
}
Expand Down
20 changes: 20 additions & 0 deletions internal/dms/biz/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,7 @@ type SqlWorkbenchUser struct {
type SqlWorkbenchUserRepo interface {
GetSqlWorkbenchUserByDMSUserID(ctx context.Context, dmsUserID string) (*SqlWorkbenchUser, bool, error)
SaveSqlWorkbenchUserCache(ctx context.Context, user *SqlWorkbenchUser) error
DeleteSqlWorkbenchUserCache(ctx context.Context, dmsUserID string) error
}

// SqlWorkbenchDatasource SqlWorkbench数据源缓存
Expand All @@ -233,9 +234,15 @@ type SqlWorkbenchDatasourceRepo interface {
GetSqlWorkbenchDatasourceByDMSDBServiceID(ctx context.Context, dmsDBServiceID, dmsUserID, purpose string) (*SqlWorkbenchDatasource, bool, error)
SaveSqlWorkbenchDatasourceCache(ctx context.Context, datasource *SqlWorkbenchDatasource) error
DeleteSqlWorkbenchDatasourceCache(ctx context.Context, dmsDBServiceID, dmsUserID, purpose string) error
DeleteSqlWorkbenchDatasourceCachesByUserID(ctx context.Context, dmsUserID string) error
GetSqlWorkbenchDatasourcesByUserID(ctx context.Context, dmsUserID string) ([]*SqlWorkbenchDatasource, error)
}

// SqlWorkbenchLifecycle 删除 DMS 用户时的 SqlWorkbench/ODC 生命周期清理(策略 B)
type SqlWorkbenchLifecycle interface {
CleanupOnDMSUserDelete(ctx context.Context, dmsUserID, dmsUserName string) error
}

type UserUsecase struct {
tx TransactionGenerator
repo UserRepo
Expand All @@ -247,9 +254,15 @@ type UserUsecase struct {
ldapConfigurationUsecase *LDAPConfigurationUsecase
cloudBeaverRepo CloudbeaverRepo
gatewayUsecase *GatewayUsecase
sqlWorkbenchLifecycle SqlWorkbenchLifecycle
log *utilLog.Helper
}

// SetSqlWorkbenchLifecycle 注入策略 B 清理能力(由 apiserver 在 SqlWorkbenchService 就绪后接线)
func (d *UserUsecase) SetSqlWorkbenchLifecycle(lifecycle SqlWorkbenchLifecycle) {
d.sqlWorkbenchLifecycle = lifecycle
}

func NewUserUsecase(log utilLog.Logger, tx TransactionGenerator, repo UserRepo, userGroupRepo UserGroupRepo, pluginUsecase *PluginUsecase, opPermissionUsecase *OpPermissionUsecase,
OpPermissionVerifyUsecase *OpPermissionVerifyUsecase, loginConfigurationUsecase *LoginConfigurationUsecase, ldapConfigurationUsecase *LDAPConfigurationUsecase, cloudBeaverRepo CloudbeaverRepo, gatewayUsecase *GatewayUsecase,
) *UserUsecase {
Expand Down Expand Up @@ -719,6 +732,13 @@ func (d *UserUsecase) DelUser(ctx context.Context, currentUserUid, UserUid strin
return fmt.Errorf("delete cloudbeaver cache failed: %v", err)
}

// 策略 B:清 SqlWorkbench 缓存 + 会话,并对 ODC 对应用户禁用(ODC 失败不阻断)
if d.sqlWorkbenchLifecycle != nil {
if err := d.sqlWorkbenchLifecycle.CleanupOnDMSUserDelete(tx, UserUid, ds.Name); err != nil {
return fmt.Errorf("delete sql workbench cache failed: %v", err)
}
}

if err := d.repo.DelUser(tx, UserUid); nil != err {
return fmt.Errorf("delete user error: %v", err)
}
Expand Down
18 changes: 18 additions & 0 deletions internal/dms/storage/sql_workbench.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ func (sr *SqlWorkbenchRepo) SaveSqlWorkbenchUserCache(ctx context.Context, user
})
}

func (sr *SqlWorkbenchRepo) DeleteSqlWorkbenchUserCache(ctx context.Context, dmsUserID string) error {
return transaction(sr.log, ctx, sr.db, func(tx *gorm.DB) error {
if err := tx.WithContext(ctx).Where("dms_user_id = ?", dmsUserID).Delete(&model.SqlWorkbenchUserCache{}).Error; err != nil {
return fmt.Errorf("failed to delete sql workbench user cache: %v", err)
}
return nil
})
}

func convertModelSqlWorkbenchUser(user *model.SqlWorkbenchUserCache) *biz.SqlWorkbenchUser {
return &biz.SqlWorkbenchUser{
DMSUserID: user.DMSUserID,
Expand Down Expand Up @@ -110,6 +119,15 @@ func (sr *SqlWorkbenchDatasourceRepo) DeleteSqlWorkbenchDatasourceCache(ctx cont
})
}

func (sr *SqlWorkbenchDatasourceRepo) DeleteSqlWorkbenchDatasourceCachesByUserID(ctx context.Context, dmsUserID string) error {
return transaction(sr.log, ctx, sr.db, func(tx *gorm.DB) error {
if err := tx.WithContext(ctx).Where("dms_user_id = ?", dmsUserID).Delete(&model.SqlWorkbenchDatasourceCache{}).Error; err != nil {
return fmt.Errorf("failed to delete sql workbench datasource caches by user id: %v", err)
}
return nil
})
}

func (sr *SqlWorkbenchDatasourceRepo) GetSqlWorkbenchDatasourcesByUserID(ctx context.Context, dmsUserID string) ([]*biz.SqlWorkbenchDatasource, error) {
var datasources []model.SqlWorkbenchDatasourceCache
err := transaction(sr.log, ctx, sr.db, func(tx *gorm.DB) error {
Expand Down
Loading