Independent analysis by NHI Mgmt GroupSource article: Authzed, “ABAC by example: basic permissions and dynamic access control” (December 9, 2025)

TL;DR: ABAC can express dynamic, context-aware authorization, but traditional implementations struggle to scale because they evaluate policy logic on every decision, according to Authzed’s analysis of SpiceDB caveats. The practical lesson is that fine-grained policy works best when attribute checks are confined to the edge of a graph-based permissions model, not treated as a universal replacement for ReBAC.


At a glance

What this is: NHI Mgmt Group's analysis, drawing on Authzed's blog post: ABAC caveats let teams attach dynamic attribute checks to ReBAC relationships, avoiding the scale problems of running full policy logic on every authorization decision.

Why it matters: IAM and IGA teams need this distinction because authorization models that look flexible on paper can become operationally brittle if they push too much logic into decision-time evaluation, especially for fine-grained access and runtime context checks.


Context

ABAC is attribute-based access control, a model that decides access by evaluating properties on users, resources, or the surrounding context. In practice, the article argues that treating ABAC as a universal replacement for relationship-based access control creates scale and performance problems once policies become complex and decisions are made for every request.

For IAM practitioners, the important question is not whether ABAC is expressive enough, but where attribute checks belong in the authorization stack. The post frames SpiceDB caveats as a way to keep dynamic policy logic close to specific relationships while preserving the structure and scalability of ReBAC.

This is an authorization design question, not a tool question. The relevant choice is whether your permissions model can support dynamic conditions without turning every access decision into an expensive policy execution path.


Key questions

Q: How should teams decide whether an access rule belongs in ABAC or ReBAC?

A: Use ReBAC for stable relationships that define who is connected to what, and use ABAC-style conditions only when the rule depends on changing context such as time, network location, or session state. The test is whether the condition should travel with the permission edge or remain part of the broader relationship model.

Q: Why does full ABAC become harder to operate as environments scale?

A: Because full ABAC evaluates rule logic on every authorization decision, the cost grows with request volume, attribute complexity, and the number of resources being protected. At scale, that turns latency, caching, and policy maintenance into core design constraints rather than implementation details.

Q: What breaks when dynamic permissions are not tied to explicit policy?

A: Access decisions become inconsistent, difficult to audit, and easy to reinterpret by different parties. In smart data programmes, that means the same request may be approved differently across organisations, creating governance drift. Without explicit policy-to-enforcement mapping, the control model becomes manual exception handling.

Q: When should organisations use conditional relationships instead of broad roles?

A: Use conditional relationships when access depends on a narrow piece of context and the underlying relationship itself is still valid. That approach is better than broad roles when the real question is whether a specific access path should be active right now, not whether the user belongs to a permanent group.


Technical breakdown

Why full ABAC becomes expensive at scale

Standard ABAC evaluates rules at decision time, often by executing policy logic across multiple attributes for every permission check. That approach is flexible, but it also makes latency and caching harder to manage as the number of users, resources, and conditions grows. The article’s core point is that ABAC can describe almost any rule, yet that expressiveness is not free. Once the policy engine must interpret custom logic repeatedly, performance becomes part of the security design rather than a separate concern.

Practical implication: Keep dynamic attribute logic narrow enough that it does not become the dominant cost in the authorization path.

How caveats embed conditional ABAC inside ReBAC

Caveats are conditional expressions attached to relationships, so the graph still carries the main authorization structure while the attribute check applies only where needed. In the article’s model, a relationship such as a viewer or editor edge can be gated by a caveat like is_public_today, which means the relationship exists only when the context matches. That is materially different from encoding every rule in a full policy engine. The result is a graph-first model with targeted context sensitivity rather than a policy-first model trying to do everything at decision time.

Practical implication: Use conditional relationships when only a subset of permissions needs context-aware logic.

Why time, IP and token checks are best treated as edge conditions

The article highlights three common caveat patterns: time-based access, IP-restricted access, and session or token-bound access. These are all examples of context that changes quickly and should not be baked into static role assignments. They work well as edge conditions because they answer a narrow question about whether a specific access path should be active right now. That design keeps the underlying relationship graph stable while allowing the surrounding context to determine whether the permission is currently valid.

Practical implication: Reserve caveats for volatile conditions such as time, network location, or session claims.


NHI Mgmt Group analysis

ABAC should be treated as a precision control, not a replacement architecture. The article shows that ABAC is expressive enough to model many permission questions, but expressiveness alone does not make it the right default for enterprise authorization. When every decision becomes a policy execution problem, scale and operational consistency start to erode. Practitioners should treat ABAC as a scoped control for edge conditions, not a blanket permissions strategy.

Conditional authorization is strongest when it is attached to a stable relationship graph. ReBAC gives teams a durable structure for who can reach what, while caveats let them add context only where it matters. That combination is more governable than pushing all attributes into a single decision layer, because the graph remains auditable and the dynamic logic stays local to the permission that needs it. The implication is that authorization design should separate structure from context.

Dynamic access controls expose a broader governance problem: policy portability is not the same as policy scalability. A rule that can be written in one engine is not automatically safe to run everywhere, at every decision point, with every request. The article’s deeper lesson is that authorization models must be judged by runtime behaviour, not just by how much they can express. Teams should evaluate where policy belongs in the stack before assuming flexibility equals maturity.

ABAC caveats create a useful named pattern: scoped policy edges. This is the practical middle ground between static relationships and fully dynamic policy execution. It lets practitioners preserve the graph as the source of permission truth while binding context checks only to the edges that need them. That is the right mental model for teams trying to keep authorization fine-grained without making it fragile.

From our research library:

What this signals

Scoped policy edges: The most useful ABAC pattern is not broad policy replacement, but context checks attached to specific authorization edges. That keeps the permissions graph stable while still allowing time, location, or session claims to influence a decision at the point of use.

When teams treat ABAC as a universal authorization layer, they often discover that governance and runtime performance become the limiting factors. The better programme design is to decide which checks belong in durable relationships, which belong in caveats, and which should never be part of access control at all.


For practitioners

  • Define which access rules belong in the graph Separate stable permission relationships from volatile context checks before you design the schema. If a rule changes often or depends on request-time attributes, keep it as a conditional edge rather than encoding it as a universal policy.
  • Limit caveats to edge conditions Use caveats for narrow context such as time, IP range, or session claims, and avoid turning them into the primary authorization layer. That keeps the graph auditable and the runtime cost bounded.
  • Model public or temporary access as conditional relationships Represent temporary access as a relationship that exists only when a caveat evaluates true, rather than as a broad role that must be reinterpreted on every check.
  • Test authorization performance under realistic decision volume Measure how the permission system behaves when attribute checks, graph traversal, and caching all run together at production scale. The failure mode here is not just incorrect access, but slow or inconsistent decisions.

Key takeaways

  • ABAC is most effective when it handles dynamic conditions at the edge of a permissions graph, not when it replaces the entire authorization model.
  • The article’s key warning is operational, not theoretical: policy logic that runs on every decision becomes harder to scale and govern as complexity rises.
  • Practitioners should separate stable relationship structure from volatile context checks so that fine-grained access stays auditable and performant.

Standards & Framework Alignment

This section maps relevant standards and security frameworks to the operational risks and controls described in this guidance.

OWASP Non-Human Identity Top 10 and OWASP API Security Top 10 address the attack and risk surface, while NIST CSF 2.0 and NIST Zero Trust (SP 800-207) set the governance and control requirements practitioners need to meet.

FrameworkControl / ReferenceRelevance
OWASP Non-Human Identity Top 10NHI-04 — Insecure AuthenticationThe article centres on request-time authorization conditions and identity-bound access decisions.
Recommendation — Bind context-sensitive access decisions to identity-aware relationships rather than broad static policy checks.
NIST CSF 2.0PR.AA-05 — Access Permissions, Entitlements and AuthorizationsThis post is fundamentally about how access permissions are structured and evaluated.
Recommendation — Design authorization flows so entitlements stay auditable while context checks remain narrowly scoped.
NIST Zero Trust (SP 800-207)Policy Engine — Policy EngineCaveats and ReBAC both sit inside a zero-trust authorization decision path.
Recommendation — Keep policy evaluation close to decision points but separate stable relationships from dynamic conditions.
OWASP API Security Top 10API5 — Broken Function Level AuthorizationThe examples describe fine-grained authorization controls for application access paths.
Recommendation — Map application permissions to explicit authorization logic and test that every protected function is gated correctly.

Key terms

  • Attribute-Based Access Control: Attribute-Based Access Control is a policy model that grants or denies access using attributes such as user role, device state, location, and application context. It replaces purely static role assignment with a decision process that can adapt to current conditions, provided the underlying attributes are trustworthy and well-governed.
  • Relationship-Based Access Control (ReBAC): A model that grants or denies access based on relationships between identities, resources, and contextual objects. Instead of hard-coding who can do what, ReBAC evaluates whether the relevant graph links exist at decision time, which makes it well suited to collaboration-heavy and agentic environments.
  • Caveat: A caveat is a conditional check attached to a relationship or entitlement, allowing access only when runtime context meets a defined rule. In practice, it lets teams keep the permission graph stable while adding precise, temporary constraints such as time or IP matching.
  • Policy Engine: A policy engine evaluates identity, device, and transaction data against defined rules and then automates the access decision. It is the mechanism that turns zero trust from a concept into an operational control by allowing approval, blocking, quarantine, or revocation based on risk.

Deepen your knowledge

NHI governance, agentic AI identity, and machine identity lifecycle are core topics in our NHI Foundation Level course, the industry's only accredited NHI security programme. If you are building or maturing an IAM programme, it is worth exploring.
NHIMG Editorial Note
Published by the NHIMG editorial team on June 11, 2026.
Updated on October 11, 2026.
NHI Mgmt Group, the independent authority on Non-Human Identity, IAM, and Agentic AI security. nhimg.org