ПРАВА ПОЛЬЗОВАТЕЛЯ

Для чего необходимо уметь определять права пользователя? Допустим перед нами стоит задача по созданию отчета по вкладам. Ничего сложного, делаем запрос по таблице 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}

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