【问题标题】:Struct field level permissions结构字段级权限
【发布时间】:2021-04-05 18:18:56
【问题描述】:

我在玩 gin-gonic+sqlx。现在我想知道将数据库记录动态绑定到结构的最佳方法是什么?

说我有这样的结构和查询。

type Project struct {
    ID        string    `db:"id"`
    CreatedAt time.Time `db:"created_at"`
    UpdatedAt time.Time `db:"updated_at"`
    DeletedAt NullTime  `db:"deleted_at"`
    Name      string
    Status    string
    OpenDate  NullTime `db:"open_date"`
    Number    uint
}

func (p Project) List() ([]Project, error) {
    var pp []Project
    err := db.Select(&pp, "SELECT * FROM Project")
    return pp, err
}

现在我想为这个结构添加字段级权限。例如,管理员可以查看和编辑所有字段;用户A可以查看CreatedAtName;用户B可以查看和编辑NameStatus和查看Number

我正在为每个用例编写乘法结构,但显然,我确实选择了最愚蠢的方式。 我能想到的另一种方法是实现 Struct Tag。我是在正确的轨道上还是有更好的方法来做到这一点?

【问题讨论】:

  • 您希望这些权限反映在数据库中吗?还是只是在应用程序级别?
  • @Flimzy 仅限应用程序级别。所有字段都在一个表中
  • 好的。这要简单得多。它还使问题的 SQL 部分变得无关紧要(这就是它更简单的原因!)

标签: go go-gin sqlx


【解决方案1】:

我们可以创建多个结构并相互嵌入。 示例:


type ProjectSummary struct {
    ID   string `db:"id"`
    Name string
}

type ProjectUser struct {
    ProjectSummary
    CreatedAt time.Time `db:"created_at"`
}

type ProjectSupport struct {
    ProjectSummary
    Status string
    Number uint
}

type ProjectAdmin struct {
    ProjectSupport
    CreatedAt time.Time `db:"created_at"`
    UpdatedAt time.Time `db:"updated_at"`
    DeletedAt NullTime  `db:"deleted_at"`
    OpenDate  NullTime  `db:"open_date"`
}

【讨论】:

  • 是的,这正是我现在正在做的事情。我只是觉得它在某种程度上不够优雅。因为它不容易跟踪和修改。
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多