AuthorizationContextRequest(UserId, Product, Resource) vyberá context. Resolver z neho zostaví AuthorizationGrantRequest(UserId, Product, ResourceKinds) pre reader. Plánovanie potom používa AuthorizationPlanRequest(RequestId, Principal, Resource, Action).
Implementovaná príprava
LegacySqlAuthorizationGrantAdapter.ReadAsync() načíta aktívne assignments, permissions rolí a priamy/skupinový/verejný prístup z databázy danej product inštancie. SQL pred načítaním obmedzí scope anchors a podporované permissions.
Normalize(rows, diagram, resourceKinds) preloží číselné kódy na pomenované grants a overí scopes. Surový LegacyAuthorizationGrantRow zostáva pri tomto adapteri.
SmartExchangeAuthorizationContextResolver.ResolveAsync() vyberie root + anotované ciele, validuje vybrané fakty a vytvorí roles: ["user"], attr.product a attr.grants. Výber znovu presadí aj pri použití iného readera.
AuthorizationGrant má šesť polí: pôvodný assignment, ID scope záznamu, autorizovaný resource, action, scope a príznak verejného assignmentu. IsPublic=false môže byť priamy aj skupinový prístup; nerozlišuje cestu členstva.
Dočasný fakt */admin/Instance v kóde zatiaľ zostáva. Legacy pseudoakcia admin aj resource * sa pri migrácii odstránia. Resolver automaticky nemapuje databázovú rolu s názvom exportAdmin na Cerbos rolu.
Dva grants → dve derived roles → dve celé policies
Oba príklady sledujú rovnaké kroky a používajú ten istý spoločný kód. Person export prijíma Company/read grant cez vzťah. Navrhovaný InterestedParty export prijíma InterestedParty/read v Project scope. Použitie read pre export je explicitné rozhodnutie policy; nemení action grantu a nevyplýva z bežného Project/read.
Obe kompletné demo policies používajú verziu presentation-demo, importujú existujúci derived-role set a obsahujú jedno export ALLOW pravidlo. Izolujú relationship cestu; neobsahujú exportAdmin, priamy ani instance-wide root bypass. Nevyhovujúce requests sú odmietnuté. Ide o dokumentačné návrhy, nie dnešné kompletné production/default policies.
Person/export
Ilustračný CompanyReader assignment sa normalizuje na Company/read/Resource. Demo policy povoľuje export Person cez tento Company vzťah.
# Runtime snapshot: aks-smartcloud-nonprod / dev-authorization / derived-role-person-company-read
# Read on 2026-10-27. YAML content only; not a Kubernetes installation manifest.
apiVersion: api.cerbos.dev/v1
description: >-
Person.companyIds ReBAC condition: the user has a normalized Company/read
grant for at least one related record. This definition alone grants no action.
derivedRoles:
name: person_company_read
variables:
local:
personCompanyReadAll: >-
has(P.attr.grants) && P.attr.grants.exists(g,
g.resource == "Company" && g.action == "read" && g.scope == "Instance")
personCompanyReadIds: >-
has(P.attr.grants) ? P.attr.grants.filter(g,
g.resource == "Company" && g.action == "read" && g.scope == "Resource" &&
g.resourceId != "00000000-0000-0000-0000-000000000000").map(g, g.resourceId) : []
definitions:
- name: person_with_readable_company
parentRoles: [user]
condition:
match:
expr: >-
R.kind == "Person" &&
R.attr.companyIds.exists(relatedId,
V.personCompanyReadAll || relatedId in V.personCompanyReadIds)
Resource policy · celý demo YAML
Resource policy · celý demo YAML
# Documentation proposal only; not deployed. Separate version, no admin/direct bypass.
apiVersion: api.cerbos.dev/v1
description: Person export using read access to a related Company.
resourcePolicy:
version: presentation-demo
resource: Person
importDerivedRoles:
- person_company_read
rules:
- name: export-persons-through-readable-company
actions: [export]
derivedRoles: [person_with_readable_company]
effect: EFFECT_ALLOW
Assignment roly Project View zo snapshotu sa normalizuje na InterestedParty/read/Project. Export je navrhovaná ďalšia operácia, ktorú táto demo policy akceptuje.
Rovnaký mechanizmus, iný význam grantu. Person rola kontroluje Company/read grants. InterestedParty rola kontroluje InterestedParty/read so scope Project; nesmieme ju nahradiť nasadenou rolou nad cieľovým Project/read. Samotný import derived-role set neudeľuje akciu; resource policy musí použiť danú rolu.
Aktuálny kód/runtime, oddelene od týchto ukážok: Person source policy · Person live default · InterestedParty live default. Person v zdrojovej policy zapisuje vzťah inline; demo ukazuje zodpovedajúcu kompozíciu cez derived role. InterestedParty/default dnes povoľuje túto scoped rolu pre read, nie pre export.
Zdroj: MicroApps + NuGet repozitáre. Runtime policies: non-prod DEV, kontrola 2026-10-27. Pri tejto úprave neprebehol C# build ani aplikačný deployment. Navigácia ← / → mimo ovládacích prvkov. Všetky assets a downloady fungujú offline.