【问题标题】:Hasura object permission based authorizationHasura 对象基于权限的授权
【发布时间】:2021-09-14 08:03:39
【问题描述】:

我正在尝试在 Hasura 上设置“行选择”权限。我有一个(为简洁起见)数据模型,如下所示

用户

id: UserID

应用程序

id: AppID

应用权限

user_id: User ID
app_id: App ID
permissions: [ ENUM: Admin, View, Owner ]

饲料

app_id: AppID
feed_data: Some Feed Data

现在,我希望查询所有 Feed 以获取经过身份验证的用户。查询可以是以下形式

  • 获取经过身份验证的用户拥有查看权限的所有应用
query MyQuery {
  feed(limit: 10) {
    app_id
    feed_data
  }
}
  • 在查询过滤器中获取带有app_id 且经过身份验证的用户具有查看权限的应用
query MyQuery {
  feed(limit: 10, where: {app_id: {_in: [1, 2]}}) {
    app_id
    feed_data
  }
}

由于feed 表中没有直接包含user_id 信息,我不能直接对feed 表使用X-Hasura-User-Id 属性。我还尝试对app_permission 表使用_exists 关系,但我无法将app_id 过滤器放在权限子句中。

{
  "_exists": {
    "_where": {
      "user_id": {
        "_eq": "X-Hasura-User-Id"
      }
    },
    "_table": {
      "schema": "public",
      "name": "app_permission"
    }
  }
}

我不确定如何使用 Hasura 进行此类数据建模。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: hasura hasura-jwt


    【解决方案1】:

    由于你没有直接关系,我认为你可以通过 appPermissions 表查询,而不是直接查询 feeds 表。

    当您使用 appId 作为外键关系创建feeds 表时,Hasura 可让您跟踪此关系,如下所示 这样您就可以对 appPerms 表进行嵌套的 graphQL 查询,如下所示

    query GetUserFeeds {
      test_appPerms {
        id
        userId
        feeds(limit: 10) {
          app_id
          id
          feed_data
        }
      }
    }
    

    【讨论】:

    • 感谢@sooraj 回答我的问题。但是,如果我需要访问更多的嵌套关系,我是否必须为每个表配置权限?示例 - 对于此示例,对于角色用户,如果我们有提要 -> 网站关系,并且我想要 QL 中的网站属性,我是否必须同时配置提要和网站的权限?另外,为了能够配置权限,我必须创建一个从提要、网站到 app_permission 的对象关系?
    【解决方案2】:

    我想建议的另一件事是,您可以尝试使用像 x-hasura-app-id 这样的会话变量以及 x-hasura-role 并围绕它建立您的权限。

    https://hasura.io/docs/latest/graphql/core/auth/authorization/roles-variables.html

    【讨论】:

    • 您好,感谢您的回答。但是,我无法在 JWT 声明中传递应用程序 ID。用户可能会获得额外的权限来查看其他应用程序,并且可以异步撤销应用程序的权限。如果我这样做,我每次都必须使用我的 Auth 服务器验证 JWT 令牌。不确定这是不是个好主意。
    • 对不起,我之前并不清楚,但这些标头将是请求标头的一部分,不一定是声明映射。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2012-05-07
    • 2015-01-18
    • 2019-12-08
    • 2018-02-20
    • 2015-03-11
    • 2011-05-07
    相关资源
    最近更新 更多