ПРАВА ПОЛЬЗОВАТЕЛЯ
Для чего необходимо уметь определять права пользователя? Допустим перед нами стоит задача по созданию отчета по вкладам. Ничего сложного, делаем запрос по таблице loan, отбирая договора у которых loan.contract = "dps". Тем самым в отчет попадут все договора вкладов. Правильно ли это? Согласно логике запроса, конечно же - да, но посмотрим на это с другой стороны. Когда раздавались права пользователей на чтение классов вкладов, преследовалась цель, что пользователь по каким-то причинам не должен видеть определенные классы договоров вкладов. И что же получается, запустив наш отчет, он чудесным образом обходит эту преграду? Логичным будет сохранить ограничения по правам пользователя в нашем отчете.
Разграничение прав пользователя в АБС Бисквите условно можно разделить на 2-е части. Первое - это непосредственно право доступа к классам и таблицам метасхемы, второе - по правам доступа к объектам подчиненных пользователя. Другими словами пользователь может иметь права просмотра всех вкладов, но не иметь права просмотра вкладов созданных определенным пользователем.
МЕТАСХЕМА
Основным инструментом по работе с правами пользователя на объекты классов метасхемы является библиотека интерфейса rights (pp-right.p). К сожалению исходник данной библиотеки является закодированным и посмотреть его содержимое - невозможно, тем не менее...
ФУНКЦИИ:
GetRightClasses(in-class-code, in-right). Возвращает список доступных текущему пользователю по указанному уровню доступа in-right указанного класса и его подклассов.
- in-class-code - класс, CHAR тип;
- in-right - уровень права доступа:
- "R" - просмотр;
- "C" - создание;
- "W" - редактирование;
- "D" - удаление.
GetRightClass(in-class-code, in-right). Возвращает логическое значение (тип LOGICAL) отражающие наличие/отсутствие указываемого уровня доступа текущего пользователя на указанный класс.
- in-class-code - класс, тип CHAR;
- in-right - уровень права доступа, тип CHAR:
- "R" - просмотр;
- "C" - создание;
- "W" - редактирование;
- "D" - удаление.
GetTablePermission(in-file-name, in-right). Возвращает логическое значение (тип LOGICAL) отражающие наличие/отсутствие указываемого уровня доступа текущего пользователя на указанную таблицу БД.
- in-file-name - таблица, тип CHAR;
- in-right - уровень права доступа, тип CHAR:
- "R" - просмотр;
- "C" - создание;
- "W" - редактирование;
- "D" - удаление.
GetTablePermissionEx(in-class-code, in-right). Возвращает логическое значение (тип LOGICAL) отражающие наличие/отсутствие указываемого уровня доступа текущего пользователя на таблицу базы данных указанного класса.
- in-class-code - класс, тип CHAR;
- in-right - уровень права доступа, тип CHAR:
- "R" - просмотр;
- "C" - создание;
- "W" - редактирование;
- "D" - удаление.
ПОДЧИНЕННЫЕ ПОЛЬЗОВАТЕЛЯ
Инструментом определения прав на объекты подчиненных пользователя, является временная таблица ttRights описанная в brwsubright.def. Основные процедуры по работе с ней описаны в subright.pro.
Таблица ttRights:
- user-id - код пользователя подчиненного, тип CHAR;
- freading - наличие права на просмотр объектов подчиненного, тип LOGICAL;
- fediting - наличие права на редактирование объектов подчиненного, тип LOGICAL;
- fdelete - наличие права на удаление объектов подчиненного, тип LOGICAL.
Формирование таблицы ttRights:
{globals.i}
{intrface.get rights}
{checkusr}
{brwsubright.def}
{subright.pro}
/* Сбросим таблицу подчиненных */
RUN ResetTTRights.
/* формируем ttRights */
{brwsubright.str}
{setdest.i}
FOR EACH ttRights:
DISPL ttRights.
END.
{preview.i}
{intrface.del}
Вернемся к нашему отчету по вкладам. Построим запрос по вкладам с учетом прав пользователя:
{globals.i}
{intrface.get rights}
{checkusr}
{brwsubright.def}
{subright.pro}
DEF VAR vClassesAvail AS CHAR NO-UNDO.
/* Получение списка доступных для просмотра классов вкладов */
vClassesAvail = GetRightClasses ("dep_person", "R").
/* Сбросим таблицу подчиненных */
RUN ResetTTRights.
/* Перечитываем ttRights */
{brwsubright.str}
{setdest.i}
FOR EACH loan WHERE loan.contract EQ "dps"
AND CAN-DO(vClassesAvail, loan.class-code),
FIRST ttRights WHERE ttRights.user-id EQ loan.user-id
AND ttRights.freading EQ TRUE NO-LOCK:
DISPL loan.cont-code loan.class-code.
END.
{preview.i}
{intrface.del}
Теперь в отчет, в зависимости от того какой пользователь его формирует, будут попадать только те договора, на которые у пользователя есть права как на чтение по классам, так и по подчиненным пользователям.