diff --git a/ordinis-admin-ui/src/auth/usePermissions.ts b/ordinis-admin-ui/src/auth/usePermissions.ts index 24391e3..961e7bc 100644 --- a/ordinis-admin-ui/src/auth/usePermissions.ts +++ b/ordinis-admin-ui/src/auth/usePermissions.ts @@ -11,31 +11,46 @@ import { useAuth } from 'react-oidc-context' * * *

Phase 1d: подключим decode JWT → realm_access.roles, и эти hook'и - * начнут возвращать false для users без \`ordinis-schema-reviewer\` / - * \`ordinis-schema-publisher\` ролей. UI hide'ит соответствующие кнопки. + * начнут возвращать false для users без {@code ordinis:schema:reviewer} + * / {@code ordinis:schema:publisher} ролей. UI hide'ит соответствующие + * кнопки. + * + *

Naming convention: roles используют colon-separated namespace + * pattern {@code ordinis::} (как Altum-style scope roles + * вида {@code ordinis:client:restricted}). Совпадает с realm role parser + * в {@code ScopeContext.java}. Dash-форма ({@code ordinis-schema-reviewer}) + * НЕ используется в этом проекте — colon-стиль consistent с уже-existing + * scope ролями ({@code ordinis:client:public|internal|restricted}). * *

До тех пор все logged-in юзеры могут жать любые workflow buttons — * backend гейт остаётся primary defence. */ +const ROLE_SCHEMA_REVIEWER = 'ordinis:schema:reviewer' +const ROLE_SCHEMA_PUBLISHER = 'ordinis:schema:publisher' +const ROLE_SCHEMA_MAKER = 'ordinis:schema:maker' + /** Может ли актор approve / request_changes / reject schema draft. */ export function useCanReviewSchema(): boolean { const auth = useAuth() // TODO Phase 1d: const roles = (auth.user?.profile as { realm_access?: { roles?: string[] } })?.realm_access?.roles ?? [] - // return roles.includes('ordinis-schema-reviewer') + // return roles.includes(ROLE_SCHEMA_REVIEWER) + void ROLE_SCHEMA_REVIEWER return auth.isAuthenticated } /** Может ли актор publish approved schema draft (bump live version). */ export function useCanPublishSchema(): boolean { const auth = useAuth() - // TODO Phase 1d: roles.includes('ordinis-schema-publisher') + // TODO Phase 1d: roles.includes(ROLE_SCHEMA_PUBLISHER) + void ROLE_SCHEMA_PUBLISHER return auth.isAuthenticated } /** Может ли актор create schema draft (maker side). */ export function useCanCreateSchemaDraft(): boolean { const auth = useAuth() - // TODO Phase 1d: roles.includes('ordinis-schema-maker') OR any authenticated + // TODO Phase 1d: roles.includes(ROLE_SCHEMA_MAKER) OR any authenticated + void ROLE_SCHEMA_MAKER return auth.isAuthenticated }