GraphQL 授权/许可
GraphQL Authorization / Permission
基本上你是如何处理权限的?
假设我们有一个 Post(s) 的列表,其中有一个参数 first 来限制post 的数量。只有所有者和批准的用户才能阅读 post,其他人不能。实现这个的最佳方法是什么?
query {
{
viewer {
posts(first: 10) {
id
text
}
}
}
}
我目前在想的是,拥有一个单一的真实来源来确定用户是否可以阅读 post,并将其与 dataloader
模块联系起来。
但是,我如何查询恰好 10 posts?如果我在我的数据库中查询恰好 10 行,然后我稍后使用一些业务逻辑过滤它们,那么我可以获得例如 8 posts 返回。
一种解决方案是不在查询中添加 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,这是我试图避免的。
也许我在某种程度上错误地解决了这个问题,因为业务逻辑存在于数据库之外的另一层,所以除了查询所有行别无他法。任何帮助表示赞赏。
供将来参考和其他人寻找解决方案。
使用Dataloader解决认证问题
从字面上实现了他们在 https://dev-blog.apollodata.com/graphql-at-facebook-by-dan-schafer-38d65ef075af and used this boilerplate repo 中所做的作为指导。没什么好说的了。
基本上你是如何处理权限的?
假设我们有一个 Post(s) 的列表,其中有一个参数 first 来限制post 的数量。只有所有者和批准的用户才能阅读 post,其他人不能。实现这个的最佳方法是什么?
query {
{
viewer {
posts(first: 10) {
id
text
}
}
}
}
我目前在想的是,拥有一个单一的真实来源来确定用户是否可以阅读 post,并将其与 dataloader
模块联系起来。
但是,我如何查询恰好 10 posts?如果我在我的数据库中查询恰好 10 行,然后我稍后使用一些业务逻辑过滤它们,那么我可以获得例如 8 posts 返回。
一种解决方案是不在查询中添加 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,这是我试图避免的。
也许我在某种程度上错误地解决了这个问题,因为业务逻辑存在于数据库之外的另一层,所以除了查询所有行别无他法。任何帮助表示赞赏。
供将来参考和其他人寻找解决方案。 使用Dataloader解决认证问题
从字面上实现了他们在 https://dev-blog.apollodata.com/graphql-at-facebook-by-dan-schafer-38d65ef075af and used this boilerplate repo 中所做的作为指导。没什么好说的了。