GraphQL授权/许可

时间:2017-04-30 22:27:28

标签: graphql graphql-js

所以基本上你如何处理权限?

假设我们有一个帖子(s)的列表,其中一个参数第一个来限制帖子数量。并且只有所有者和已批准的用户才能阅读帖子,其他人都无法阅读。实现这个的最佳方法是什么?

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,这是我想要避免的。

也许我正在以某种方式解决问题,因为业务逻辑存在于另一层而不是数据库层,因此除了查询所有行之外别无他法。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

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

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