【发布时间】:2025-12-04 19:25:01
【问题描述】:
如何防止人们查询他们不应该在 graphql 中看到的对象的关系?
例如,假设我们有以下数据模型。
type Board {
id: ID! @unique
name: String!
boardUserRoles: [BoardUserRole!]!
}
type BoardUserRole {
id: ID! @unique
board: Board!
user: User!
role: BoardRole!
}
type User {
id: ID! @unique
tasks: [Task!]!
userName: String! @unique
boardUserRoles: [BoardUserRole!]!
}
这是一种设置,其中有可以访问某些板的用户。而BoardUserRole 决定了用户对特定表的角色。
现在,我过来查询一个我有权使用的板,并查看它的名称。
query {
board(where: {id: "3"}) {
id
name
}
}
这很好。但是,如果我更改查询,我可以联系系统的其他用户并查看他们的任务。我基本上可以看到与该用户相关的任何内容。
query {
board(where: {id: "3"}) {
id
name
boardUserRoles {
user {
tasks
}
}
}
}
您如何防止此类查询?
【问题讨论】:
-
这是个严肃的问题?这就像“我有一个带密码的 sql 表 - 如何不使用 select 显示它们” - API 根本不应该返回您没有权限的数据。不管是 sql、rest、graphql 等等。检查 prisma 文档?
-
@xadm 是的。严肃的。也许我没有正确理解某些东西,但是如果用户可以访问板 3,您将如何阻止他们使用其余模式来遍历图表以获取其他数据?你说得很明显,所以请让我知道你在想什么。我已经阅读了 prisma、Apollo 和 graphql,但没有发现任何关于如何限制某人在一个查询中要求返回整个图表的信息。我知道一种方法可以通过覆盖解析器上的
info来做到这一点,只有我希望他们获得的数据,但我不想剥夺用户的这种能力。 -
在 graphql 中,您可以拥有字段级别的安全性。
It doesn't matter it's traversing or simple query- 解析器总是分开处理。当用户没有权限时,您应该限制返回字段。 F.e.不要显示一些数据,当你不是作者或主持人时不要更新帖子内容...... 2 秒谷歌搜索:github.com/prismagraphql/prisma/issues/1768,prisma 权限指令...... -
@xadm 这些读物非常好,我相信这正是我想要的。将在星期一对此进行更多研究。泰
标签: angular graphql apollo prisma