OxL Справочник OxL
РусскийEnglish

13.4 Авторизация и политики

oxl
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 (метод никому не доступен).

Права на данные:

oxl
@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