fix(oauth): avoid overwriting user state when binding
This commit is contained in:
@@ -190,6 +190,30 @@ func UpdateUserSetting(userId int, setting dto.UserSetting) error {
|
||||
return updateUserSettingCache(userId, settingValue)
|
||||
}
|
||||
|
||||
// userBindColumns 允许通过 UpdateUserBindColumn 更新的第三方账号绑定列白名单。
|
||||
// 列名只可能来自代码内部的 provider 实现,白名单是防御纵深,不依赖调用方自律。
|
||||
var userBindColumns = map[string]bool{
|
||||
"github_id": true,
|
||||
"discord_id": true,
|
||||
"oidc_id": true,
|
||||
"linux_do_id": true,
|
||||
"wechat_id": true,
|
||||
}
|
||||
|
||||
// UpdateUserBindColumn 第三方账号绑定字段的专用更新。
|
||||
// 绑定操作必须只写绑定列:若改为“读取完整用户 → 改一个字段 → 整体更新”,
|
||||
// 读快照期间并发发生的封禁、降权或分组变更会被旧快照覆盖恢复。
|
||||
// 角色、状态、分组只允许通过各自带锁/CAS 的专用方法修改。
|
||||
func UpdateUserBindColumn(userId int, column string, value string) error {
|
||||
if userId <= 0 {
|
||||
return errors.New("id 为空!")
|
||||
}
|
||||
if !userBindColumns[column] {
|
||||
return fmt.Errorf("invalid user bind column: %s", column)
|
||||
}
|
||||
return DB.Model(&User{}).Where("id = ?", userId).Update(column, value).Error
|
||||
}
|
||||
|
||||
// 根据用户角色生成默认的边栏配置
|
||||
func generateDefaultSidebarConfigForRole(userRole int) string {
|
||||
defaultConfig := map[string]interface{}{}
|
||||
|
||||
Reference in New Issue
Block a user