Кроме безопасности на основе логина и пароля существует внутренняя безопасность серверного приложения. Данная безопасность заключается в:
- фильтрация таблиц, представлений, функций;
- фильтрация состава колонок при выборке;
- фильтрация доступных операций для таблиц, представлений, функций;
- создание;
- редактирование;
- удаление;
- фильтрация данных по пользователю;
- фильтрация данных по ролям;
- фильтрация данных по собственным условиям.
Разграничение прав доступа в система реализовано, через применение ролей пользователей.
Если у пользователя несколько ролей, то при фильтрации будет учитываться более приоритетная роль. Информация о ролях храниться в таблице core.pd_roles.
Фильтрация доступа к таблицам, представлениям и функциям.
Фильтрация данных осуществляется через разграничение доступа к определенной сущности по логину и роли пользователя. Информации об этом хранится в таблице core.pd_accesses. Полное описание данной таблицы можно посмотреть тут https://docs.appcode.pw/docs?project=mobnius-net-server&file=modules/dbcontext.js#functions.
Основной принцип заключается в том, что если информация о безопасности не занесена в указанную выше таблицу, то доступ к данным будет не обграничен. Для добавления записи требуется указать:
- пользователя, для которого будет доступна сущность;
- роль, для которой будет доступна сущность;
- имя сущности (таблица, представление, функция) для которой предоставляется доступ;
- указание свойств:
- права на удаление;
- права на создание;
- права на редактирование;
- полный доступ — позволят просматривать удаленный данные.
Пример
Пользователь | Роль | Сущность | Создание / Удаление / Редактирование | |
Права на таблицу pd_users всем пользователям с ролью master | master | pd_users | ||
Права пользователю admin на редактирование таблицы cd_settings | admin | cd_settings | false|false|true | |
Права на работу с таблицей customers всем | customers | true|true|true |
За обработку вышеуказанных данных отвечает процедура core.pf_accesses.
Фильтрация состава колонок при выборке.
Информация аналогично предыдущей фильтрации храниться в таблице core.pd_accesses. Распределение прав пользователям и ролям, тоже, аналогична. Но для фильтрации колонок доступно еще одно поле c_columns. В данное поле через запятую записываться наименования колонок, которые не должны быть выведен на основе вышеуказанного фильтра.
пример
Запрещаем вывод колонок с паролем для таблицы пользователи все, у кого есть роль user.
Пользователь | Роль | Сущность | Набор колонок |
user | pd_users | s_salt,s_hash,c_password |
Фильтрация доступных операций для таблиц, представлений, функций.
Реализация данного функционала была показана в первом пункте.
Фильтрация данных по собственным условиям.
Данный механизм позволяет создавать свои собственные условия для фильтрации данных. Разграничение доступа аналогично вышеуказанному пункту, но в дополнение доступно поле c_criteria, которое хранить информацию в формате JSON. Фильтр данных должен происходить по правилам указанным тут. Для указания “динамичности” данных, есть возможность фильтрации по пользователю, делающему запрос к системе.
Например, требуется отфильтровать информации, только по тем записям, которые принадлежать авторизованному пользователю. Для этого нужно создать такой запрос:
{
"property": "f_user",
"value": $user_id
}
, где $user_id — константа, будет динамически замена на идентификатор пользователя.
Фильтрация собственных функции созданных по правилам RPC и зарегистрированных в системе.
В системе доступна возможность создания собственных RPC функции. И для привязки к ним безопасности нужно аналогично предыдущим примерам разграничить права и заполнить значение поля c_function. Указанное поле хранит в себе имя функции, к которой будет применен фильтр. Например, был создан объект shell, который находится в пространстве имен PN. У данного объекта есть метод getServerTime, который возвращает серверное время. Для указания доступа, можно воспользоваться одним из следующих способов.
Предоставить доступ ко всем методам объекта shell | PN.shell.* |
Предоставить доступ только к методу getServerTime | PN.shell.getServerTime |