【问题标题】:GraphQL Authorization / PermissionGraphQL 授权/权限
【发布时间】:2017-09-28 10:45:47
【问题描述】:

那么基本上你是如何处理权限的?

假设我们有一个帖子列表,其中有一个参数first来限制帖子的数量。只有所有者和批准的用户可以阅读帖子,其他人不能。实现这一点的最佳方法是什么?

query {
  {
    viewer {
      posts(first: 10) {
        id
        text
      }
    }
  }
}

我目前的想法是,为用户是否可以阅读帖子提供单一的事实来源,并将其与dataloader 模块挂钩。

但是,我如何查询正好 10 个帖子?如果我查询我的数据库正好 10 行,然后我用一些业务逻辑过滤它们,那么我可以获得例如 8 个返回的帖子。

一种解决方案是不在查询中添加limit,但这不是很有效。那么有什么好的方法来解决这个问题呢?


灵感来自这里

(1)https://dev-blog.apollodata.com/auth-in-graphql-part-2-c6441bcc4302

(2)https://dev-blog.apollodata.com/graphql-at-facebook-by-dan-schafer-38d65ef075af

(1) 解决了

export const DB = {
  Lists: {
    all: (user_id) => {
      return sql.raw("SELECT id FROM lists WHERE owner_id is NULL or owner_id = %s, user_id);
    }
  }
}

作为查询,然后过滤掉哪些行可以读取:

resolve: (root, _, ctx) => {
    // factor out data fetching
    return DB.Lists.all(ctx.user_id)
      .then( lists => {
        // enforce auth on each node
        return lists.map(auth.List.enforce_read_perm(ctx.user_id));
      });
  }

因此,我们可以清楚地看到它正在查询所有行,即使第一个参数是 1,这是我要避免的。

也许我以某种方式处理了错误的问题,因为业务逻辑位于数据库层之外的另一层,因此除了查询所有行之外别无他法。任何帮助表示赞赏。

【问题讨论】:

  • 您可以通过多种方式使用 GraphQL 处理身份验证和权限,基本上由您来决定合适的方法 :) 只是想向您指出另外两个可能有用的资源。 1. 2017 年阿波罗日的精彩演讲youtube.com/watch?v=xaorvBjCE7A 2. 我们在graphcool 实现权限的方式:graph.cool/blog/…

标签: graphql graphql-js


【解决方案1】:

供将来参考和其他寻找解决方案的人使用。 使用Dataloader解决认证问题。

从字面上实现了他们在https://dev-blog.apollodata.com/graphql-at-facebook-by-dan-schafer-38d65ef075af 中所做的事情,并使用this boilerplate repo 作为指导。没什么好说的了。

【讨论】:

    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2021-08-19
    • 2022-08-24
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多