A policy defining resource access
An access policy is the set of rules that decides who may do what to which resource. It governs authorisation, the question of what an already-identified user is allowed to do, which is distinct from authentication, the question of who they are. Knowing a user is Sarah is authentication. Deciding Sarah may delete this invoiceInvoiceSales & RevenueAn invoice for billingView reference → but not that one is the access policy doing its jobJobUserJob To Be Done: what the user is trying to accomplishView reference →.
The founding principle is older than the models that implement it. In The Protection of Information in Computer Systems (1975), Jerome Saltzer and Michael Schroeder set out eight design principles, among them least privilege: every user and every program should operate with the minimum set of permissions needed for the taskTaskProduct SpecificationA unit of work within a story or epicView reference →. Every access policy since has been an attempt to express least privilege without making the system unusable.
The dominant model was formalised by David Ferraiolo and Rick Kuhn in a 1992 NIST paper on role-based access control. RBAC groups permissions into roles and assigns roles to users, so access tracks job function instead of being granted one user at a time. It was standardised as ANSI/INCITS 359 in 2004 and remains the default in most enterprise software. Its limit shows in scale: organisations accrete hundreds of near-duplicate roles, a drift known as role explosion.
Two responses followed. Attribute-based access control (ABAC) writes rules over attributes of the user, resource, and environment ("a manager in the EU region may approve expenses under 5,000 euro during business hours"), trading the simplicity of roles for fine-grained expressiveness. Relationship-based access control (ReBAC) decides access from the graph of relationships between users and resources, the model Google described in its 2019 Zanzibar paper and which powers Google Drive-style "shared with" permissions. Alongside the models, Open Policy Agent made policy-as-code mainstream: rules written in the Rego language, version-controlled and tested like any other code, evaluated by a decoupled engine the application queries for a yes or no.
A collaboration tool starts with RBAC: owner, editor, viewer. It works until customers ask for document-level sharing, where a viewer of a workspace can be an editor of one specific file shared with them directly. Roles cannot express that without a role per document, so the team moves the per-document decisionsDecisionStrategyA recorded decision with context, rationale, and consequencesView reference → to a ReBAC model: a user may edit a document if there is an editor relationship between them and that document, directly or inherited through a folder.
They keep the coarse workspace roles in RBAC and express the fine-grained sharing as relationships, evaluated by Open Policy Agent so the policy lives in a repository with tests and review. Least privilege holds because the default is no relationship and therefore no access, and every grant is an explicit edge someone created.
In the Unified Product Graph, an access policy sits in the security region as a governing rule rather than a runtime mechanism. A Security PolicydefinesAccess Policyhierarchy edge ties it to the broader policy it derives from, keeping the authorisation rules anchored to organisational intent. A security_policy_defines_access_policyProductrestricts access withAccess Policyhierarchy edge grounds the rule in the system that enforces it, and an product_restricts_access_with_access_policyAccess PolicygovernsServicecross-domain edge names the specific service it covers, so the scope of any rule is queryable. That structure keeps the principle and the implementation connected: a service governed by no access policy is an open question, and an access policy attached to no security policy is a rule no one can trace back to a decision.access_policy_governs_service
Type-specific fields on BaseNode
resourcestringCovered resource or system
principalstringUser, role, or group granted
permission_levelstringAccess level
conditionstringConditions (e.g. "VPN only", "business hours")
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
5 phases — initial: proposed · template: APPROVAL
3 edge types connected to this entity.
product_restricts_access_with_access_policysecurity_policy_defines_access_policyaccess_policy_governs_service