【问题标题】:i try to use Field-Level Permission in gorm, but it does not work我尝试在gorm中使用字段级权限,但它不起作用
【发布时间】:2022-01-07 19:18:52
【问题描述】:

我的数据结构如下

type DynamicConfig struct {
    gorm.Model
    AppName string `json:"app_name" form:"app_name"`
    Creator string `gorm:"<-:create" json:"creator" form:"creator"`
    Editor string `json:"editor" form:"editor"`
    Metadata string `json:"metadata" form:"metadata"`
}

我的想法是创建者创建后不能更改,所以我使用 gorm:"

{
      "ID": 4,
      "CreatedAt": "2021-11-30T13:05:31Z",
      "UpdatedAt": "2021-12-01T06:22:02Z",
      "DeletedAt": null,
      "app_name": "test3",
      "creator": "xx",
      "editor": "yy",
      "metadata": "test3"
}

这是我的更新方法:

func UpdateDynamicConfig(dc DynamicConfig) error {
    res, err := GetDynamicConfig(DynamicConfig{
        AppName:  dc.AppName,
    })
    if err != nil {
        return err
    }else if len(res) == 0 {
        return errors.New("app conf not exists")
    }else if len(res) != 1 {
        return errors.New("more than one config meet the criteria, please check")
    }

    config := res[0]
    
    result := DB.Model(&config).Updates(dc)
    return result.Error
}

我这样调用方法

    config := model.DynamicConfig{AppName: "test3", Creator: "xxxx"}
    model.UpdateDynamicConfig(config)

然后创建者更新为 xxxx。 如何防止字段被更新? 请帮帮我,非常感谢!

【问题讨论】:

    标签: mysql go go-gorm


    【解决方案1】:

    请使用省略它在更新表中的数据时不会考虑该列。请参考此link 省略

    result := DB.Model(&config).Omit("creator").Updates(dc)
    

    有关字段级别的权限,请参阅此link

    你可以试试这个

    Name string `gorm:"->;<-:create"` // allow read and create
    

    【讨论】:

    • 我申请了gorm:"->;
    • 如果这解决了你的问题,你能支持我的回答吗?
    • 我第一次为您的回答点赞,但它显示“感谢您的反馈!您需要至少 15 声望才能投票,但您的反馈已被记录。”我感到很抱歉。
    【解决方案2】:

    在更新中省略字段的最简单方法是使用 Omit 函数:

    result := DB.Model(&config).Omit("Creator").Updates(dc)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-05
      • 2021-12-19
      • 1970-01-01
      • 2020-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-08-26
      相关资源
      最近更新 更多