13.4 Авторизация и политики
policy Orders {
allow get(id) if caller.isUser(db.find(Order, id)?.userId)
allow list, recent if caller.has(role: .Support)
allow * if caller.service("billing")
deny delete unless caller.has(role: .Admin) && caller is .User(mfa: true, ..)
}
@public rpc health() -> Ok
@allow(role: .Admin) rpc purge() -> Ok
@internal rpc create(…) -> Order- Объект политики: сервис (правила по rpc), шардированный актор (по
msg), топик (publish,subscribe), динамический конфиг (set). - Вычисление: если подходит хотя бы одно
deny— отказ; иначе если подходит хотя бы одноallow— разрешение; иначе отказ. Отказ —AccessDenied(PERMISSION_DENIED). - Условие — выражение с доступом к параметрам rpc по имени,
caller,ctx; разрешены эффектыpureи чтениеdb. Исключение: условия политик динамической конфигурации (policy Limits { allow set if … }, §14.2) — толькоpure, безdbиctx(поправка редакции 1.0, D-8056; DIV-028; D-5203). @allow(role: r)— сокращение дляallow m if caller.has(role: r). Форма@allow(lint: правило, reason: "…")— не политика доступа, а подавление правила анализатора (III.4).- Условие правила
publishтопика видитcaller,element(публикуемое значение) и, дляsharded by,key; условиеsubscribe— толькоcaller. Внешние принципалы допускаются, если не сработало ни одно условиеdenyи сработало условиеallow; правило с другой операцией — ошибкаunknown-policy-target(D-8064; D-7790). - Модель доступа (
oxl access, раздел «Права» inspector) охватывает rpc, сообщения шардированных акторов и операции топиков: для каждого — правила и роли, которые его вызывают; без правил элемент отмечен как открытый (D-8064; D-7790, D-7792).
Автоматические права между сервисами. Компилятор строит граф вызовов: какой код какой роли вызывает какие rpc, сообщения и топики. Для каждой пары «роль → метод» генерируется неявное правило allow m if caller.service is роль. Остальные вызовы от сервисов запрещены на уровне mTLS-идентичности.
Внешние принципалы. Для User и Anonymous действует только явное: правило allow, @public или @allow. Без них вызов отклоняется. @internal явно помечает метод как недоступный внешним принципалам. rpc, который не разрешён внешним принципалам, не помечен @internal и не вызывается из кода программы, — ошибка компиляции missing-policy (метод никому не доступен).
Права на данные:
@table("orders") @owner(.userId, bypass: [.Support, .Admin])
data Order { … }
data Employee {
name: str
@visible(role: .HR) salary: Money?
}@owner(.поле)— запросы к таблице отUserбез ролей изbypassавтоматически получают условиеполе == caller.id. Границы действия: условие добавляется кfind,query,count,update,delete; оно не применяется кload(…)и к сырому SQL (execute) — доступ через них ДОЛЖЕН ограничиваться политикой; запись строки с владельцем, отличным отcaller, отвергается (поправка редакции 1.0, D-8056; DIV-029; D-5030, D-5069).@visible(role: r)— поле не передаётся принципалам без ролиr; поле ДОЛЖНО быть опциональным или иметь значение по умолчанию.@auditна rpc или политике пишет каждое решение в системный топикoxl.audit.oxl access diffпоказывает изменение прав после изменения кода;oxl access who-can Orders.delete— кто и через какие роли может вызвать метод.
Связанные диагностики
data-rights, missing-policy, unknown-policy-target
См. также
Исходник: docs/spec/oxl-standard.md