Custom Software Development

RBAC vs ABAC: Which Access Control Model Fits Your Custom Software

Shubham Parmar9 min read
RBAC vs ABAC — access control model comparison banner

In short: RBAC (role-based access control) grants access by assigning users to roles — simple to audit, but rigid once exceptions pile up. ABAC (attribute-based access control) grants access by evaluating attributes of the user, the resource, and the context on every request — flexible, but harder to review at a glance. Most production systems, including most ERP and CRM builds, end up using RBAC for the baseline and ABAC rules for the exceptions, not one model exclusively.

What this means for you

  • If your permission model maps cleanly to job titles or stable roles, start with RBAC — it is simpler to build, audit, and explain to a client or regulator.
  • If access genuinely needs to change by time, location, data sensitivity, or ownership, those are attribute checks — modeling them as new roles is how role explosion starts.
  • The two are not mutually exclusive: RBAC for coarse-grained access, ABAC for the conditions that narrow it, is the pattern most custom software settles on.

Every custom ERP, CRM, or internal platform needs an answer to the same question: who can see or change what? "RBAC vs ABAC" is usually where that design conversation starts, and most teams pick wrong in one of two directions — either bolting on ABAC-style conditions before the role model actually needs them, or forcing every exception into a new role until nobody can audit the permission list anymore. The right answer depends on how your access rules actually behave, not on which model sounds more modern.

What RBAC actually does

Role-based access control assigns every user one or more roles, and every role carries a fixed set of permissions. An Accountant role can view and create invoices. An Admin role can manage users and billing settings. Checking access means checking whether the user’s role includes the permission the action requires — nothing else is evaluated.

That simplicity is the point. A non-technical stakeholder can look at a role list and understand exactly what it grants, which is why RBAC remains the default starting point for admin panels, internal tools, and most SaaS products.

What ABAC actually does

Attribute-based access control, formally defined in NIST SP 800-162, decides each request by evaluating attributes of the subject (department, seniority, employment status), the resource (sensitivity level, owner, tenant), the action, and the environment (time of day, network, device) — together, as a policy, rather than a fixed role lookup. The same user can be allowed to approve an expense report at 10am from the office network and denied the identical action at 2am from an unrecognized device, with no role change involved.

That precision comes at a cost: an ABAC policy set is harder to read at a glance than a role list, and it only works if the attributes it depends on are actually accurate and available at request time — a stale department field or missing tenant ID silently breaks the policy, not loudly.

RBAC vs ABAC at a glance

RBACABAC
Access decided byRole membershipAttributes of user, resource, action, context
Easiest toAudit and explainAdapt to context without new roles
Main failure modeRole explosionPolicy sprawl, silent attribute drift
Fits bestStable, job-shaped permissionsRules that depend on time, location, ownership, or sensitivity
Typical useAdmin panels, internal tools, most ERP/CRM baselinesMulti-tenant isolation, regulated data, zero-trust policies

Where RBAC breaks down: role explosion

RBAC degrades the same way almost every time: a legitimate one-off exception — "this one accountant also needs read access to the APAC ledger" — gets handled by creating a new role instead of a condition. Repeat that pattern for a few years across a growing system, and, per Evolveum’s documentation on the problem, the number of roles can climb into the thousands even for a modest-sized organization, often approaching or exceeding the number of actual users. At that point the role list stops being an audit tool and becomes something nobody can review with confidence — which defeats the reason most teams chose RBAC in the first place.

The fix is not switching models wholesale. It is recognizing which exceptions are genuinely new job functions (a new role) versus which are conditions on an existing one (an attribute check) — and refusing to let the second kind masquerade as the first.

Where ABAC breaks down: policies nobody can review

ABAC’s failure mode is the inverse of RBAC’s. Instead of too many roles, you get a policy engine evaluating a web of conditions that compound in ways that are hard to predict from reading any single rule — "is this user allowed to do this" stops being answerable without actually running the evaluation. It also depends entirely on attribute quality: if the system that feeds department, tenant, or ownership data gets it wrong, the access decision is wrong too, and usually silently, since nothing looks "broken" from the policy’s perspective.

This is why ABAC pays off specifically where the access rule genuinely cannot be expressed as a role — not as a default posture applied everywhere because it sounds more rigorous.

The hybrid pattern most production systems land on

In practice, the RBAC-vs-ABAC framing is a false binary for most custom software. The pattern that shows up repeatedly across enterprise identity guidance is: RBAC establishes the coarse-grained baseline (what a role can touch at all), and attribute checks narrow that access under specific conditions (tenant match, record ownership, approval thresholds, time windows). A Manager role can approve purchase orders — that’s RBAC. The approval only applies to POs under their department’s budget and before month-end lock — that’s ABAC layered on top. Neither model alone expresses the real rule; together they do, without either the role list or the policy set becoming unreadable.

Which model fits your custom software

Start with RBAC if

  • Permissions map cleanly to job titles or stable functions (Admin, Manager, Staff, Read-only).
  • You need the permission model to be auditable at a glance, including by non-technical stakeholders or a compliance reviewer.
  • You are building the first version of the system and do not yet have evidence that context-dependent rules are actually required.

Layer in ABAC where

  • Access depends on data the role system can’t express — tenant isolation, record ownership, approval amount thresholds, or time-boxed access.
  • You are in a regulated space (healthcare, fintech) where access conditions are defined by policy, not job title, and need to be enforced per request.
  • Role explosion has already started — new roles are being created for what are really conditions, not new jobs.

In an ERP or CRM specifically

Most of what a custom ERP or CRM needs to control — who can view a module, who can edit records, who can approve a transaction — is genuinely role-shaped, which is why RBAC is the right default baseline for these systems. The attribute checks worth adding on top are usually narrow and specific: tenant or business-unit isolation in a multi-tenant deployment, record-level ownership (a sales rep sees their own accounts, a manager sees their team’s), and amount- or date-based approval limits. Building the full ABAC policy engine before any of those specific needs exist is the more common mistake than under-building it.

What’s changing in 2026

The access-control space has been moving toward standardizing the interface between applications and policy engines, rather than each team inventing its own. The OpenID Foundation’s AuthZEN Authorization API 1.0 was ratified as a Final Specification in January 2026, giving applications, API gateways, and policy decision engines a standard way to ask "can this subject perform this action on this resource" and get a consistent answer back — regardless of whether the engine behind it is evaluating roles, attributes, or both. For teams building custom software today, the practical takeaway is less about adopting the spec immediately and more about the direction it confirms: the RBAC-vs-ABAC decision is really about how you model permissions, and increasingly decoupled from which engine evaluates them.

If you’re scoping the permission model for a new ERP, CRM, or internal platform and want a second opinion on where the RBAC baseline should end and attribute checks should start, that’s exactly the kind of design decision we work through on every custom software engagement before a line of access-control code gets written.

Frequently asked questions

What is the difference between RBAC and ABAC?

RBAC (role-based access control) grants access based on a user's assigned role — an "Accountant" role can view invoices, an "Admin" role can edit users. ABAC (attribute-based access control) decides access per request by evaluating attributes of the user, the resource, the action, and the context — department, data sensitivity, time of day, location — rather than a fixed role list. RBAC answers "who are you"; ABAC answers "given everything about this request, should it be allowed right now."

Can RBAC and ABAC be used together?

Yes, and in production systems this is more common than using either one alone. The typical pattern is RBAC for the coarse, stable baseline — what module or resource type a role can touch at all — with ABAC rules layered on top to narrow that access by context: a Manager role can approve expense reports, but only for their own department, and only before the reports lock at month-end.

What is role explosion, and how do you avoid it?

Role explosion happens when teams model every exception as a new role instead of a condition — "Accountant", "Accountant-APAC", "Accountant-APAC-ReadOnly", and so on — until the number of roles rivals or exceeds the number of users, and nobody can tell what a role actually grants. It's avoided by keeping roles to broad, stable job functions and pushing anything that varies by context (region, data owner, time window) into an attribute check instead of a new role.

Is ABAC more secure than RBAC?

Not inherently — ABAC is more precise, not automatically more secure. A well-scoped RBAC system with a handful of clean roles is easier to audit and harder to misconfigure than a sprawling ABAC policy set nobody fully understands. ABAC's security advantage shows up specifically when access genuinely needs to vary by context the role system can't express; used everywhere by default, it just moves the risk from "too many roles" to "policies too complex to review."

Which model fits a multi-tenant SaaS or ERP system?

Start with RBAC for the baseline — tenant admin, manager, standard user, read-only — since most ERP and CRM permission needs are genuinely role-shaped (who can approve a PO, who can edit a customer record). Layer in attribute checks only where the business actually requires them: tenant isolation (a user's attributes must match the record's tenant ID), record-level ownership, or approval limits that depend on amount or department. Reaching for full ABAC before the role model needs it adds policy overhead most ERP/CRM builds don't get back.

Sources

Need help putting this into practice?

Tech Programmer builds and ships this work for startups and enterprises. Tell us what you are trying to do and we will tell you what it takes.

Related reading