sarin regmi
03/03/2026, 12:47 PMAsk Inkeep
03/03/2026, 12:47 PMAsk Inkeep
03/03/2026, 12:47 PMglobal tenant where all users get reader role
• *Tenant-owned resources*: Model tenants as parent tenants, clients as child tenants
• *Role assignments*: Assign users to multiple tenants with appropriate roles (2)
The challenge: For tenant admins with _partial_ client access, you'd need to explicitly assign them only to specific client tenants—not all clients under their tenant.
*Option 2: ReBAC (Relationship-Based) *
ReBAC handles your "tenant admin with access to only selected clients" requirement more elegantly through relationships. (3)
However, you've identified the key tradeoff: ReBAC typically requires syncing resource instances to Permit to establish relationship tuples.
*Minimizing Sync Overhead with ReBAC:*
1. *Sync only relationship-bearing resources*: You don't need to sync every resource—only those that define ownership/access boundaries (tenants, clients) . Individual resources within a client can inherit permissions from their parent client relationship.
2. *Use ABAC for resource-level filtering*: Combine ReBAC for structural relationships (platform→tenant→client) with ABAC attributes for filtering resources within those boundaries. This reduces what you sync.
3. *External data sources*: OPAL supports fetching data from external APIs dynamically rather than syncing everything upfront. (4)
*My Recommendation:*
Given your requirement for tenant admins with selective client access, a hybrid approach works best:
• Use *tenants* in Permit to represent your "clients" (the lowest isolation boundary)
• Use *ReBAC* to model the platform→tenant→client hierarchy for role derivation
• Sync only structural entities (tenants, clients) , not every resource within them
I don't have complete documentation on avoiding all resource syncing while maintaining full ReBAC capabilities. Would you like me to connect you with the team for a deeper architecture discussion?
Reach out via Email for a more detailed consultation on your specific architecture.Ask Inkeep
03/03/2026, 12:47 PMsarin regmi
03/03/2026, 12:58 PMAsk Inkeep
03/03/2026, 12:58 PMAsk Inkeep
03/03/2026, 12:59 PMAsk Inkeep
03/03/2026, 12:59 PMsarin regmi
03/03/2026, 1:01 PMOr Weis
03/03/2026, 1:15 PMOr Weis
03/03/2026, 1:16 PMsarin regmi
03/03/2026, 10:12 PMAsk Inkeep
03/03/2026, 10:12 PMpermit support automation2
03/03/2026, 10:12 PMAsk Inkeep
03/03/2026, 10:12 PMpolicy:123#parent@client:A to traverse. Without this, it can't determine that policy 123 belongs to Client A, which belongs to Tenant B—and therefore can't deny Client D's admin access based on relationship derivation. , (2)
*Your options:*
1. *Sync resource instances at creation time* – When policy 123 is created under Client A, sync it to Permit and create the relationship tuple. This is the standard ReBAC approach. (3)
2. *Check at a higher level* – Instead of checking permit.check(user, "read", "policy:123"), check against the client resource: permit.check(user, "read", "client:A"). Your application then verifies that policy 123 belongs to Client A before serving it. The authorization boundary is the client, not individual policies.
3. *Use ABAC with attributes* – Store client_id as an attribute on the policy in your database. Pass it as context during the check and use ABAC conditions to verify the user's client matches the policy's client. (4)
*Practical hybrid approach:*
• Sync only structural entities (tenants, clients) to Permit
• For resources like policies, check permissions at the client level via ReBAC
• Your application enforces that the requested resource belongs to the authorized client
This avoids syncing every resource while maintaining access control boundaries.Ask Inkeep
03/03/2026, 10:12 PMsarin regmi
03/03/2026, 10:14 PMAsk Inkeep
03/03/2026, 10:14 PMAsk Inkeep
03/03/2026, 10:14 PMAsk Inkeep
03/03/2026, 10:14 PMEli Moshkovich
03/04/2026, 5:07 AMsarin regmi
03/09/2026, 3:22 PM