Архітектура
Визначення стандарту
На найвищому рівні система оперує правилами, яку групуються в політики, що зв'язують об'єкти та суб'єкти системи розмежування. Запити в систему здійнюються через інформаційну точку (Policy Information Point) в ядро системи (Policy Decision Point), де знійснюєьться обчислення ефективного доступу. Самі правила зберігаються у вбудованій в Erlang/OTP RDBMS mnesia (Policy Administration Point). Фронтальне API визначається як точка виклику (Policy Enforcement Point).
Точки підключення
Типи точок підключення, де здійснюються клієнтські виклики ABAC, визначаються наступним переліком:
BLOCK — Блокування користувача
SEARCH — Пошук документу по полям
VIEW — Видимі елементи: Табулятори, Меню, Помічники, Пошукові кнопки, Чат
CREATE — Створення документів, резолюцій, фільтрів, кнопок
EDIT — Редагування форм, додатків
DELETE — Видалення ділопроцесу певного документа
NEXT — Кнопки управління задачами
REJECT — Кнопки управління повернення
SIGN — Кнопки управління підписом
REGISTER — Реєстрація документів
CANCEL — Кнопка відміна документа
SEND — Кнопка відправки документа
RECEIVE — Отримання документів з асинхронних ендпойнтів
STATUS — Панель управління для виконавців, до відома та помічників
Об'єкти
-record(object_process, {
module = [] :: [] | atom(),
stage = [] :: [] | list(),
status = [] :: [] | atom(),
sched = [] :: [] | tuple()
}).
-record(object_file, {
type = [] :: [] | term(),
sign = [] :: [] | boolean(),
convert = [] :: [] | failed | true | false
}).
-record(object_form, {
id = [] :: [] | atom(),
fields = [] :: [] | atom()
}).
-record(object_corr, {
id = [] :: [] | list() | binary(),
code = [] :: [] | list() | binary(),
sendType = [] :: [] | term(),
type = [] :: [] | list() | binary()
}).
-record(object_email, {
id = [] :: [] | list() | binary(),
email = [] :: [] | list() | binary(),
name = [] :: [] | list() | binary()
}).
-record(object_employee, {
id = [] :: [] | list() | binary(),
org = [] :: [] | list() | binary(),
branch = [] :: [] | list() | binary(),
roles = [] :: [] | list()
}).
Суб'єкти
-record(subject_employee, {
id = [] :: [] | list() | binary(),
roles = [] :: [] | list(atom()),
routing = [] :: [] | atom(),
substitute_type = [] :: [] | assistant | delegat,
status = [] :: [] | atom(),
org = [] :: [] | list(),
branch = [] :: [] | list()
}).
PEP
defmodule ABAC.API do
require ABAC
def decision(ABAC.request() = r) do
:erlang.apply(:"Elixir.ABAC.PDP", :decision, [r])
end
def decision(_), do: false
end
-record(request, {
type = [] :: [] | atom(),
endpoint = [] :: [] | atom(),
subject = [] :: [] | term(),
context = [] :: [] | term(),
resources = [] :: [] | list()
}).
-record(context, {
form = [] :: [] | tuple(),
pid = [] :: [] | list() | binary(),
corr = [] :: [] | tuple(),
notification = [] :: [] | tuple(),
stage_status = [] :: [] | tuple(),
files = [] :: [] | tuple(),
employee = [] :: [] | tuple()
}).
PDP
-record(rule, {
id = [] :: binary(),
api_endpoint = [] :: atom(),
description = <<>> :: binary(),
type = auth :: auth | deny,
condition = [] :: [] | list(),
resource_match = all :: all | any,
subject = [] :: [],
object = [] :: []
}).
-record(policy, {
id = [] :: binary(),
api_endpoint = [] :: atom(),
description = <<>> :: binary(),
combining = all :: all | any,
object = [] :: [] | tuple(),
rules = [] :: [] | list()
}).
Приклад
Приклад визначення політики для підпису всіх додатків:
#policy{
api_endpoint = sign,
combining = all,
object = #object_process{
module = 'Elixir.Output.Proc',
stage = #sequenceFlow {
source = "Created",
target = "Development" }},
rules = [
#rule{
api_endpoint = sign,
type = permit,
condition = employee_check,
resource_match = all,
subject = #subject_employee{
roles = [register, executor],
routing = [executor], org = Default},
object = #object_process{
module = 'Elixir.Output.Proc',
stage = #sequenceFlow{
source = "Created",
target = "Development" }}},
#rule{
api_endpoint = sign,
type = permit,
condition = employee_check,
resource_match = any,
object = #object_file{sign = true},
subject = #subject_employee{
roles = [register, executor],
routing = [executor],
org = Default}
}
]
}