Sim*_*ken 6 pagination authorization graphql
在Dan Schafer 在React Europe的优秀"GraphQL at Facebook"演讲中,他讨论了如何在业务层模型中集中授权,避免了必须为通向授权节点的每个边缘复制授权逻辑的问题.
这适用Todo.getById(1)
于在我的情况下最终最终查询数据库SELECT * from todos WHERE id=1
然后验证授权的事情checkCanSee(resultFromDatabase)
.
但是,假设我的todos
表现在包含来自多个用户的100,000个待办事项,纯粹在业务层中执行授权变得不切实际,因为我需要获取每个待办事项,使用共享授权逻辑过滤结果然后切片以执行分页.
我错误地认为解决这个问题的唯一方法是让授权逻辑驻留在持久层本身吗?
我认为 Dan\xe2\x80\x99s 演讲的要点之一是使用 GraphQL 处理授权的方式与典型的 REST 端点不同。
\n\n在 REST 中,每个资源通常与单个端点关联。当向该端点发出请求时,在处理请求之前检查请求者是否获得授权是有意义的。使用 GraphQL,我们可能会在同一请求中获取多个资源,因此这种行为不再可取。正如丹所说:
\n\n\n\n\n如果您无法看到[所请求的资源]之一,我们不想完全破坏该请求。
\n
因此,GraphQL 的首选方法是实现某种每节点授权机制,并仅返回请求者有权查看的资源。这正是演讲中的示例显示的 \xe2\x80\x93 的一种方法。
\n\n如果您将待办事项存储在 SQL 数据库表中,那么您的代码只需进行类似的查询SELECT * from todos WHERE creator_id=${viewer.id}
并完全省略使用类似的函数是非常有意义的checkCanSee
。
类似地,您可以使用限制偏移、游标等将分页直接烘焙到查询中。是的,既然您\xe2\x80\x99现在让您的数据库承担繁重的工作,您可以说我们\xe2\x80\x99ve进入持久层。然而,它仍然取决于您的业务逻辑来接受请求、清理输入、构建适当的查询并以 GraphQL 可以使用的形式返回结果。
\n\n我可以 \xe2\x80\x99t 代表 Dan,但我想他的意图并不是暗示这是实现节点授权的唯一(甚至是最佳)方法。我认为更重要的一点是,例如,如果您正在获取:
\n\n{\n header\n todos {\n description\n }\n quoteOfTheDay\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n即使未经授权的客户端仍应从服务器获取响应,然后可以使用该响应为最终用户呈现页面(即使该响应包含空的待办事项数组)。
\n 归档时间: |
|
查看次数: |
296 次 |
最近记录: |