kevinight
02/07/2026, 8:34 AMquery {
organizations {
projects {
documents {
comments { ... }
}
}
}
}
How do you dynamically extract the (relation, object_type, object_id) tuple for each nested level?
2. Field-level authorization modeling
For field-level permissions where read/write differ, how do you model this in a ReBAC model?
3. Mutations and write authorization
For mutations that touch multiple objects:
mutation {
updateProject(id: "123", input: {
name: "New Name",
ownerId: "user_456" # requires special permission
}) { ... }
}
- How do you check different permissions for different input fields?
- Do you validate before execution, during resolver, or both?
Would love to hear how others have approached this at scale?yetitwo
02/07/2026, 3:56 PMyetitwo
02/07/2026, 11:39 PMBen Simpson
02/11/2026, 8:50 PMquery {
user(id: ...) { firstName, email }
}
And if the view_email permission is denied we can still return the firstName, with a field-level authorization error for the email
We use this pattern with a GraphQL Gateway in front, the gateway itself doesn't perform any authorization. Seems to work quite well even with fairly complicated queries distributed across various services.