Спецификация RBAC

RBAC

Спецификация:

  1. «Пользователь» – Человек, или IoT устройство.
  2. «Permissions» – разрешения или полномочия, список действий, которые можно совершать пользователь в системе.
  3. «Приложение» – Установленное облачное ПО.
  4. «Room» – комната.
  5. «Слой данных» или «Volume» – Логический уровень данных для приложений. Пространство c ID "-1" является зарезервированным для всей системы. И обозначает управление главной консолью. Для всех остальных пространств их ID должны быть положительными и больше нуля.
  6. «Roles» – список ролей. Каждая роль обладает идентификатором пространства.
  7. «Сессия» – текущая сессия пользователя или устройства.
  8. «Пользователь – Роль» – соотношение, какие пользователи, какими ролями обладают.
  9. «Роль – Действие» — соотношение, какие роли, какими действиями обладают.
  10. «Пользователь – Действие» — соотношение, какие пользовали, какими действиями обладают. Также можно запрещать конкретное действие для определенного пользователя.
  11. Один пользователь может иметь несколько ролей.
  12. Одну роль могут иметь несколько пользователей.
  13. Одна роль может иметь несколько действий (Permission).
  14. Одно действие может принадлежать нескольким ролям.

ID пользователей:

> 0 – реальные пользователи
от -9999 до -1 – зарезервированные системные пользователи
— 1000 – пользователь системной шины
от -32769 и ниже – IoT устройства

-1 — Системное приложение

Более подробно в соглашении об идентификаторах.

Модель данных


Рисунок — диаграма классов

Таблицы:

  • Users — список пользователей. Он общий на всю систему.
  • Room — комната, виртуальное пространство.
  • Volume — том, слой данных
  • Softwares — список установленного программного обеспечения (приложений).
  • Permissions — список полномочий. У каждого приложения свой список полномочий.
  • IoT — список подключенных внешних устройств. У каждого виртуального пространства свои подключенные устройства.
  • App_Auth и User_Auth — таблицы авторизации для пользователей и IoT устройств. Содержат данные и методы для входа.
  • Sessions — сессии пользователя
  • Roles — список ролей. Для каждого пространства назначается свой список ролей.
  • Users_Room — список пользователей в комнате. Для каждого пространства назначаются пользователи, которые имеют доступ к этому пространтву. И этим пользователям назначаются роли и даются разрешения.
  • HavePermission — объект с описание разрешения

Single Sign-On. Технология единого входа

Есть сайт где нужно авторизоваться, и система авторизации (SSO). Схема работает следующим образом:

  1. Посылается аякс запрос в систему авторизации с проверкой авторизации.
    URL: https://bus-sso-gateway/api/org.sso/User/core.auth/check
  2. Возвращается ответ. ERROR_OK пользователь авторизован. ERROR_AUTH — пользователь не авторизован.
  3. Если пользователь авторизован, то в браузере создается уникальный временный токен для авторизации. Он отправляется заппрос на сайт во внешнюю шину. 
    URL: https://bus-site-gateway/api/org.sso/User/core.auth/signAuthTmpToken. Сайт подписывает временный токен своим приватным ключом. Токен создается на определенное время.
  4. Сайт отвечает браузеру подписанным временным токеном.
  5. Посылается аякс запрос во внешнюю шину системы авторизации. 
    SSO проверяет токен публичным ключом сайта. Это токен устанавливает временный токен для сессии для конкретного сайта.
    URL: https://bus-sso-gateway/api/org.sso/User/core.auth/setAuthTmpToken.
  6. Браузер посылает запрос сайту для авторизации через токен.
    URL: https://bus-site-gateway/api/org.sso/User/core.auth/authFromTmpToken.
  7. Сайт посылает системный запрос в SSO. Система SSO, проверяет временный токен и создает JWT токен. и возвращает его.
    URL: https://bus-sso-gateway/bus/org.sso/User/core.auth/createJWTFromTmpToken.
  8. Сайт устанавливает JWT куки и возвращает их браузеру.

Описание API

Вход в систему

URL: https://bus-gateway/api/org.sso/User/core.​auth/login

"kind": "user",
"volume_id": -1,
"data":
{
  "type": "user",
  "method": "login",
  "login: "",
  "password": "",
}

или

"kind": "user",
"volume_id": -1,
"data":
{
  "type": "iot",
  "method": "login",
  "iot_id": "",
  "volume_id": "",
  "password": "",
}

Ответом на этот запрос будет возращение статуса ERROR_OK и в куки будет установлена сессия

Выход из системы

URL: https://bus-gateway/api/org.sso/User/core.​auth/logout

"kind": "user",
"volume_id": -1,
"data":
{
}

Ответом на этот запрос будет возращение статуса ERROR_OK, очистка куки, и удаление сессии из базы данных.

Проверка авторизации

URL: https://bus-sso-gateway/api/org.sso/User/core.​auth/check

"kind": "user",
"volume_id": -1,
"data":
{
}

Пользователь неавторизован:

"kind": "user",
"code": ERROR_OK,
"response": <login_md5_hash>,

Пользователь авторизован:

"kind": "user",
"code": ERROR_AUTH,
"response": "",

Подпись временного токена авторизации

URL: https://bus-site-gateway/api/org.sso/User/core.​auth/signAuthTmpToken

"kind": "user",
"volume_id": -1,
"data":
{
  "tmp_token": <string of token>
}

Ответ:

"kind": "user",
"volume_id": -1,
"code": ERROR_OK,
"response":
{
  "tmp_token": <string of token>,
  "sign": <base64 of sign>,
}

Установка временного токена авторизации

URL: https://bus-sso-gateway/api/org.sso/User/core.​auth/setAuthTmpToken

"kind": "user",
"volume_id": -1,
"data":
{
  "tmp_token": <string of token>,
  "sign": <base64 of sign>,
}

Ответ:

"kind": "user",
"volume_id": -1,
"code": ERROR_OK,
"response":
{
  "tmp_token": <same string of token>,
  "sign": <same base64 of sign>,
  "expire": DateTime,
}

Создание JWT токена

URL: https://bus-sso-gateway/bus/org.sso/User/core.​auth/createJWTFromTmpToken

"kind": "system",
"volume_id": -1,
"data":
{
  "tmp_token": <string of token>,
  "sign": <base64 of sign>,
}

Ответ:

"kind": "system",
"volume_id": -1,
"code": ERROR_OK,
"response":
{
  "token": <jwt token>,
}

Обновление токена через системную шину

URL: https://bus-sso-gateway/bus/org.sso/User/core.​auth/updateJWT

"kind": "system",
"volume_id": -1,
"data":
{
  "token": <jwt token>,
}

Ответ:

"kind": "system",
"volume_id": -1,
"code": ERROR_OK,
"response":
{
  "token": <updated jwt token>,
}

Обновление токена через внешнюю шину

URL: https://bus-sso-gateway/api/org.sso/User/core.​auth/updateJWT

"kind": "user",
"data": null

В куки посылается JWT токен.

Ответ:

"kind": "user",
"code": ERROR_OK,
"response": null

В куки приходит обновленный JWT токен

Авторизация через временный токен

URL: https://bus-site-gateway/api/org.sso/User/core.​auth/authFromTmpToken

"kind": "user",
"volume_id": -1,
"data":
{
  "tmp_token": <string of token>,
  "sign": <base64 of sign>,
}

Ответ:

"kind": "user",
"code": ERROR_OK,
"response": null

Ответ должен установить JWT куки

Запрос на получения списка полномочий

URL: https://bus-sso-gateway/bus/org.sso/User/core.​auth/getPermissions

"kind": "system",
"volume_id": -1,
"data":
{
	"token": <jwt token>,
	"layers": List<int>,
	"software_api_name": "",
	"object_id": "",
}

Параметры layers, software_api_name, object_id — опциональны.

Ответ:

"kind": "system",
"volume_id": -1,
"response":
[
  "type": "user" or "iot",
  "user_id": <int>,
  "login": <string>,
  {
    "volume_id": <int>,
    "permissions": List<HavePermission>,
  },
  {
    "volume_id": <int>,
    "permissions": List<HavePermission>,
  },
  // ...
]

Интерфейсы и объекты

Только для системного слоя -1:

  • https://bus-gateway/api/org.sso/User/core.auth — Интерфейс авторизации для объекта User
  • https://bus-gateway/api/org.sso/User/core.crud — Интерфейс CRUD для объекта User
  • https://bus-gateway/api/org.sso/Permission/org.search — Интерфейс запроса данных для объекта Permission
  • https://bus-gateway/api/org.sso/Sessions/org.search — Интерфейс запроса данных для объекта Session
  • https://bus-gateway/api/org.cloud/DataLayer/core.crud — Интерфейс CRUD для объекта Layer (слой данных)
  • https://bus-gateway/api/org.cloud/Software/core.crud — Интерфейс CRUD для объекта Software

Для всех слоев:

  • https://bus-gateway/api/org.sso/IoT/core.crud — Интерфейс CRUD для объекта IoT
  • https://bus-gateway/api/org.sso/Role/core.crud — Интерфейс CRUD для объекта Role
  • https://bus-gateway/api/org.cloud/DataLayer/core.settings — Интерфейс управления настройками для объекта DataLayer

Формат JWT токенов

{
	"t": "", // type: «user» or «iot»
	"c": "", // created unix time
	"e": "", // expire unix time
	"u": "", // login
	"i": "", // user_id > 0 or iot_id < -32768
	"l": "", // volume_id, if IoT
	"s": "", // session_key
},