Безопасность вызова серверных процедур

Кроме безопасности на основе логина и пароля существует внутренняя безопасность серверного приложения. Данная безопасность заключается в: 

  • фильтрация таблиц, представлений, функций;
  • фильтрация состава колонок при выборке;
  • фильтрация доступных операций для таблиц, представлений, функций;
    • создание;
    • редактирование;
    • удаление;
  • фильтрация данных по пользователю;
  • фильтрация данных по ролям;
  • фильтрация данных по собственным условиям.

Разграничение прав доступа в система реализовано, через применение ролей пользователей. 

Если у пользователя несколько ролей, то при фильтрации будет учитываться более приоритетная роль. Информация о ролях храниться в таблице core.pd_roles.

Фильтрация доступа к таблицам, представлениям и функциям.

Фильтрация данных осуществляется через разграничение доступа к определенной сущности по логину и роли пользователя. Информации об этом хранится в таблице core.pd_accesses. Полное описание данной таблицы можно посмотреть тут https://docs.appcode.pw/docs?project=mobnius-net-server&file=modules/dbcontext.js#functions

Основной принцип заключается в том, что если информация о безопасности не занесена в указанную выше таблицу, то доступ к данным будет не обграничен. Для добавления записи требуется указать: 

  • пользователя, для которого будет доступна сущность;
  • роль, для которой будет доступна сущность;
  • имя сущности (таблица, представление, функция) для которой предоставляется доступ;
  • указание свойств:
    • права на удаление;
    • права на создание;
    • права на редактирование;
    • полный доступ — позволят просматривать удаленный данные.

Пример

ПользовательРольСущностьСоздание /
Удаление /
Редактирование
Права на таблицу
pd_users всем
пользователям с
ролью master 
masterpd_users
Права пользователю
admin на редактирование
таблицы cd_settings 
admincd_settingsfalse|false|true
Права на работу
с таблицей
customers всем 

customers
true|true|true

За обработку вышеуказанных данных отвечает процедура core.pf_accesses.

Фильтрация состава колонок при выборке.

Информация аналогично предыдущей фильтрации храниться в таблице core.pd_accesses. Распределение прав пользователям и ролям, тоже, аналогична. Но для фильтрации колонок доступно еще одно поле c_columns. В данное поле через запятую записываться наименования колонок, которые не должны быть выведен на основе вышеуказанного фильтра.

пример

Запрещаем вывод колонок с паролем для таблицы пользователи все, у кого есть роль user.

ПользовательРольСущностьНабор колонок
userpd_userss_salt,s_hash,c_password

Фильтрация доступных операций для таблиц, представлений, функций.

Реализация данного функционала была показана в первом пункте.

Фильтрация данных по собственным условиям.

Данный механизм позволяет создавать свои собственные условия для фильтрации данных. Разграничение доступа аналогично вышеуказанному пункту, но в дополнение доступно поле c_criteria, которое хранить информацию в формате JSON. Фильтр данных должен происходить по правилам указанным тут. Для указания “динамичности” данных, есть возможность фильтрации по пользователю, делающему запрос к системе.

Например, требуется отфильтровать информации, только по тем записям, которые принадлежать авторизованному пользователю. Для этого нужно создать такой запрос:

{
"property": "f_user",
"value": $user_id
}

, где $user_id — константа, будет динамически замена на идентификатор пользователя.

Фильтрация собственных функции созданных по правилам RPC и зарегистрированных в системе.

В системе доступна возможность создания собственных RPC функции. И для привязки к ним безопасности нужно аналогично предыдущим примерам разграничить права и заполнить значение поля c_function. Указанное поле хранит в себе имя функции, к которой будет применен фильтр. Например, был создан объект shell, который находится в пространстве имен PN. У данного объекта есть метод getServerTime, который возвращает серверное время. Для указания доступа, можно воспользоваться одним из следующих способов.

Предоставить доступ ко всем методам объекта shellPN.shell.* 
Предоставить доступ только к методу getServerTimePN.shell.getServerTime 

Print Friendly, PDF & Email