Безопасность и контроль доступа
Управление актёрами аутентификации, областями авторизации и политиками доступа.
Подключение
local security = require("security")
actor
Возвращает текущего актёра из контекста выполнения:
local actor = security.actor()
if actor then
local id = actor:id()
local meta = actor:meta()
logger:info("Запрос от", {
user_id = id,
role = meta.role
})
end
Возвращает: Actor|nil
scope
Возвращает текущую область безопасности из контекста выполнения:
local scope = security.scope()
if scope then
local policies = scope:policies()
for _, policy in ipairs(policies) do
print("Активная политика:", policy:id())
end
end
Возвращает: Scope|nil
can
Проверяет, разрешено ли действие над ресурсом в текущем контексте:
-- Проверка права на чтение
if not security.can("read", "user:" .. user_id) then
return nil, errors.new("PERMISSION_DENIED", "Нет доступа к данным пользователя")
end
-- Проверка права на запись
if not security.can("write", "order:" .. order_id) then
return nil, errors.new("PERMISSION_DENIED", "Нет доступа к изменению заказа")
end
-- Проверка с метаданными
local allowed = security.can("delete", "document:" .. doc_id, {
owner_id = doc.owner_id,
department = doc.department
})
| Параметр | Тип | Описание |
|---|---|---|
action |
string | Проверяемое действие |
resource |
string | Идентификатор ресурса |
meta |
table | Дополнительные метаданные (необязательно) |
Возвращает: boolean
new_actor
Создаёт нового актёра с идентификатором и метаданными:
-- Создание актёра-пользователя
local actor = security.new_actor("user:" .. user.id, {
role = user.role,
department = user.department,
email = user.email
})
-- Создание актёра-сервиса
local service_actor = security.new_actor("service:payment-processor", {
type = "service",
version = "1.0.0"
})
| Параметр | Тип | Описание |
|---|---|---|
id |
string | Уникальный идентификатор актёра |
meta |
table | Метаданные (ключ-значение) |
Возвращает: Actor
new_scope
Создаёт новую область безопасности:
-- Пустая область
local scope = security.new_scope()
-- Область с политиками
local read_policy = security.policy("app:read-only")
local scope = security.new_scope({read_policy})
-- Построение области пошагово
local scope = security.new_scope()
local policy1 = security.policy("app:read")
local policy2 = security.policy("app:write")
scope = scope:with(policy1):with(policy2)
Возвращает: Scope
policy
Получает политику из реестра:
local policy, err = security.policy("app:admin-access")
if err then
return nil, err
end
-- Вычисление политики
local result = policy:evaluate(actor, "delete", "user:123")
if result == "allow" then
-- разрешено
elseif result == "deny" then
-- запрещено
else
-- не определено, проверить другие политики
end
| Параметр | Тип | Описание |
|---|---|---|
id |
string | Идентификатор политики "namespace:name" |
Возвращает: Policy, error
named_scope
Получает предопределённую группу политик:
-- Получить область администратора
local admin_scope, err = security.named_scope("app:admin")
if err then
return nil, err
end
-- Использовать для привилегированных операций
local result = admin_scope:evaluate(actor, "delete", "user:123")
| Параметр | Тип | Описание |
|---|---|---|
id |
string | Идентификатор группы политик |
Возвращает: Scope, error
token_store
Получает хранилище токенов для управления аутентификацией:
local store, err = security.token_store("app:tokens")
if err then
return nil, err
end
-- Работа с хранилищем...
store:close()
| Параметр | Тип | Описание |
|---|---|---|
id |
string | Идентификатор хранилища "namespace:name" |
Возвращает: TokenStore, error
Методы Actor
| Метод | Возвращает | Описание |
|---|---|---|
actor:id() |
string | Идентификатор актёра |
actor:meta() |
table | Метаданные актёра |
Методы Scope
with / without
Добавление или удаление политик из области:
local scope = security.new_scope()
-- Добавить политику
local write_policy = security.policy("app:write")
scope = scope:with(write_policy)
-- Удалить политику
scope = scope:without("app:read-only")
evaluate
Вычисление всех политик в области:
local result = scope:evaluate(actor, "read", "document:123")
-- "allow", "deny" или "undefined"
if result ~= "allow" then
return nil, errors.new("PERMISSION_DENIED", "Доступ запрещён")
end
contains
Проверка наличия политики в области:
if scope:contains("app:admin") then
show_admin_features()
end
policies
Возвращает все политики в области:
local policies = scope:policies()
for _, policy in ipairs(policies) do
print(policy:id())
end
Возвращает: Policy[]
Методы Policy
| Метод | Возвращает | Описание |
|---|---|---|
policy:id() |
string | Идентификатор политики |
policy:evaluate(actor, action, resource, meta?) |
string | "allow", "deny" или "undefined" |
Методы TokenStore
create
Создание токена аутентификации:
local actor = security.new_actor("user:123", {role = "user"})
local scope = security.named_scope("app:default")
local token, err = store:create(actor, scope, {
expiration = "24h", -- или миллисекунды
meta = {
login_ip = request_ip,
user_agent = user_agent
}
})
| Параметр | Тип | Описание |
|---|---|---|
actor |
Actor | Актёр для токена |
scope |
Scope | Область разрешений |
options.expiration |
string/number | Время жизни (строка или мс) |
options.meta |
table | Метаданные токена |
Возвращает: string, error
validate
Проверка токена и получение актёра/области:
local actor, scope, err = store:validate(token)
if err then
return nil, errors.new("UNAUTHENTICATED", "Неверный токен")
end
Возвращает: Actor, Scope, error
revoke
Отзыв токена:
local ok, err = store:revoke(token)
Возвращает: boolean, error
close
Освобождение ресурса хранилища:
store:close()
Возвращает: boolean
Разрешения
Операции безопасности подчиняются политикам доступа.
Действия безопасности
| Действие | Ресурс | Описание |
|---|---|---|
security.policy.get |
ID политики | Доступ к определениям политик |
security.policy_group.get |
ID группы | Доступ к именованным областям |
security.scope.create |
custom |
Создание пользовательских областей |
security.actor.create |
ID актёра | Создание актёров |
security.token_store.get |
ID хранилища | Доступ к хранилищам токенов |
security.token.validate |
ID хранилища | Проверка токенов |
security.token.create |
ID хранилища | Создание токенов |
security.token.revoke |
ID хранилища | Отзыв токенов |
Настройка политик описана в разделе Модель безопасности.
Ошибки
| Ситуация | Тип | Повтор |
|---|---|---|
| Нет контекста | errors.INTERNAL |
нет |
| Пустой ID хранилища | errors.INVALID |
нет |
| Доступ запрещён | errors.INVALID |
нет |
| Политика не найдена | errors.INTERNAL |
нет |
| Хранилище не найдено | errors.INTERNAL |
нет |
| Хранилище закрыто | errors.INTERNAL |
нет |
| Неверный формат времени жизни | errors.INVALID |
нет |
| Ошибка проверки токена | errors.INTERNAL |
нет |
local store, err = security.token_store("app:tokens")
if err then
if errors.is(err, errors.INVALID) then
print("Неверный запрос:", err:message())
end
return nil, err
end
Подробнее см. Обработка ошибок.
См. также
- Модель безопасности — настройка актёров, политик и областей
- HTTP Middleware — файрвол эндпоинтов и ресурсов