Права мало

В большинстве систем у пользователя право либо есть, либо нет. Настоящие организации осторожнее — и платформа тоже.

Четыре оси

1. Действие

Есть ли у человека право — например, утверждать выплату?

2. Запись

Его ли это строка? Это могут быть его собственные записи, его организация или его ветвь иерархии.

3. Поле

Может ли он видеть это поле — и может ли его менять?

4. Доверие к сессии

Иметь право недостаточно: сессия должна достичь уровня доверия, которого требует действие, — обычная сессия, пароль или ключ, второй фактор или подпись. Шкалу задаёт каждая организация.

Доступ проверяется по трём осям: право, доверие сессии и строкаУтвердить выплатуЕсть правоpayout.approve?Доверие сессиине ниже strong?Выплата в регионахпользователя?Да: статуспереходит в ApprovedНет: отказНет: подтвердитьвторым факторомНет: строкине виднодадада
Запрос проходит право, затем доверие сессии, затем строку. У каждого «нет» свой ответ.

Три ответа, а не два

  • Разрешить
  • Запретить
  • Право есть — сначала подтвердите более сильным фактором
У финансового менеджера есть право утверждать выплаты, но он вошёл только по паролю. Система не говорит «нет» — она говорит «да, после второго фактора». Заместитель может почти всё, что может он, кроме прав, помеченных как непередаваемые.

Как это объявляется

В Cambium, языке бизнес-логики платформы, пакет один раз объявляет свои права, у каждого — нижний уровень доверия сессии; политика строк решает, какие записи видит пользователь; переход статуса называет нужное ему право и условие, которое должно выполниться:

/// Права группами; у каждого — нижний уровень доверия сессии.
permissions {
    payout level strong {
        read level identified,
        edit,
        approve implies read,
    },
    all_regions,
    director level proven,
}

/// Утверждение — ручной переход: право и условие; выше лимита нужен ещё и директор.
machine Payout.status {
    Draft -> Approved permission if amount < config.payout.approve_limit { payout.approve } else { payout.approve and director }
                      ensure amount > 0 usd and note != "" else (err.payout.state);
}

/// Политика строк: пользователь видит только выплаты своих регионов.
policy payout.read(p: Payout, actor: Actor) -> bool {
    actor.regions.contains(p.region) or actor.has(all_regions)
}
  • Читать выплаты можно с установленной личностью, утверждать — со вторым фактором, праву директора нужна личность, проверенная по документу
  • Политика строк добавляется к каждому запросу и команде автоматически — пользователь вне региона просто не видит выплату
  • Выше заданного лимита для утверждения нужен ещё и директор
  • Право и условие проверяются до смены статуса; нехватка доверия возвращает форму «подтвердите более сильным фактором», а не отказ
  • Переход, которого нет в описании, не может произойти, какие бы права ни были у пользователя

Уровни доверия образуют одну шкалу: анонимный, установленный, подтверждённый, сильный (второй фактор), проверенный (документ личности) и квалифицированный (подпись квалифицированным сертификатом). Пакет задаёт нижнюю границу; организация может её поднять, но не опустить.

Делегирование, приостановка и история

  • Некоторые права нельзя передать никогда
  • Приостановка человека снимает всё сразу, включая переданные им права
  • У выдачи прав есть срок действия
  • Каждая отклонённая попытка записывается в аудит
  • Журнал выдачи прав — источник истины, поэтому состояние доступа можно восстановить и проверить на любой прошлый момент

Для самых критичных операций

Самые критичные решения требуют взвешенных подписей «k из n»: согласиться должны несколько человек, у каждого свой вес. Необратимые действия могут требовать задержки или второго человека. Подписи гибридные — Ed25519 вместе с постквантовой ML-DSA-65.

Следующий шаг

Посмотрите на примере своего бизнеса

Запросите демо: покажем платформу на ваших процессах и договоримся, где будут жить ваши данные, — в нашем облаке или на ваших узлах.