Документация отсутствует. Требуется найти все права и выданные доступы, а так же участие, исследуемой роли на возможное присутствие в БПроцеесах и Бправилах. Можно ли какой то шаг сделать средствами платформы? Кто то сталкивался с задачей?

Нравится

1 комментарий

Насколько я понял, задача в том, чтобы посредством интерфейса системы выяснить все настроенные права доступа для конкретной роли. Если так, то какого-то единого механизма для такой задачи в приложении нет, это можно проверить только вручную в разделе Права доступа на объекты, по каждом объекту отдельно.

 

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

 

Готовых скриптов по решению этой задачи также нет.

Показать все комментарии

В API текущего приложения, не входит каких либо инструментов для упрощенной работы с элементами организационной структуры:
"Функциональные роли", "Организационные юниты", "Пользователи" (само по себе)
Уже обсуждалось вот в этой теме
Там же я выложил первые наработки, миксин-модуля с некоторыми методами решающими классические "юзкейсы".
С тех пор его пришлось существенно доработать и расширить функционал, по этому выложу его в этой отдельной теме для тех кому может понадобиться.
Во вложении (ZIP-архив) вы найдете исчерпывающую документацию в виде HTML-страницы.
Модуль реализован в виде "миксина", т.е. без каких либо трудностей подключайте в любой схеме и пользуйтесь на здоровье :) так же в конце темы есть исходный код, а так-же Уже готовая к импорту схема в виде MD-файла.
Краткое описание:
getRelAU ([id], callback, [contactModeFlag], [scope]);
Получить информацию об административных юнитах связанных с пользователем, по его идентификатору Id или Id связанного с ним контакта, или для текущего пользователя если опустить первый аргумент.
(элементы "Организационной структуры", "Функциональные роли", "Организации", "Роли руководителей" (если он в них входит)) в виде структурированного объекта с дополнительной информацией (н/п о родительских OU/FU) будут переданы в callback вызов.
checkUserInAU (AUname, [AUtype], [UserId], callback, [scope])
Проверить принадлежит ли текущий пользователь (или произвольный по его Id) к конкретному административному юниту по его имени (элементу "Организационной структуры", "Функциональные роли", "Организации").
В целях оптимизации предусмотрен поиск только по конкретным типам Орг.юнитов. Результат передается в виде булева примитива в callback-функцию
getUsersFromRole (RoleId, [getManagerFlag], callback, [scope])
Получить всех пользователей непосредственно входящих в целевые орг.юнит или функциональную роль, в том числе руководителей (пользователей из специалищированного связанного орг.юнита).
Коллекция пользователей будет передана в callback-функцию

Исходный код:

define("UserUtilsMixin", ["UserUtilsMixinResources"],
        function(resources) {
                Ext.define("Terrasoft.configuration.mixins.UserUtilsMixin", {
                        "alternateClassName": "Terrasoft.UserUtilsMixin",
                        "getRelAU": function(UserId, callback, UseContactIdFlag, scope) {
                                var serviceScope;
                                if (callback === undefined) {
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof callback === "object") {
                                        scope = callback;
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UseContactIdFlag === "object") {
                                        scope = UseContactIdFlag;
                                        UseContactIdFlag = false;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                } else if (scope.scope) {
                                        serviceScope = scope;
                                        scope = scope.scope;
                                }
                                function mainLogick(UserId, callback) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        var filter = this.scope.Terrasoft.createColumnFilterWithParameter(
                                                this.scope.Terrasoft.ComparisonType.EQUAL,
                                                "SysUser",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.addColumn("SysRole");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].Name", "AuName");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].ParentRole", "Parent");
                                        esq.addColumn("[SysAdminUnit:Id:SysRole].[SysAdminUnitType:Value:SysAdminUnitTypeValue].Name", "AuType");
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response && response.success) {
                                                                var resultObject = {
                                                                        FuncRoles: [],
                                                                        OrgUnits: [],
                                                                        Organizations: [],
                                                                        Managers: [],
                                                                        Teams: []
                                                                };
                                                                response.collection.each(function(item) {
                                                                        var wrapObj = {
                                                                                name: item.values.AuName,
                                                                                id: item.values.SysRole.value,
                                                                                parentAU: item.values.Parent
                                                                        };
                                                                        var type = item.values.AuType;
                                                                        if (type === "Division") {
                                                                                resultObject.OrgUnits.push(wrapObj);
                                                                        } else if (type === "Функциональная роль") {
                                                                                resultObject.FuncRoles.push(wrapObj);
                                                                        } else if (type === "Organization") {
                                                                                resultObject.Organizations.push(wrapObj);
                                                                        } else if (type ===  "Manager") {
                                                                                resultObject.Managers.push(wrapObj);
                                                                        } else if (type ===  "Team") {
                                                                                resultObject.Teams.push(wrapObj);
                                                                        }
                                                                });
                                                                if (serviceScope) {
                                                                        this.callback.call(serviceScope, resultObject);
                                                                } else {
                                                                        this.callback.call(scope, resultObject);
                                                                }
                                                        }
                                                },
                                                {callback: callback, scope: this.scope}
                                        );
                                }
                                var wrapOfMainLogick = mainLogick.bind({scope: scope, callback: callback});
                                if (UseContactIdFlag) {
                                        var esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        var filter = this.Terrasoft.createColumnFilterWithParameter(
                                                this.Terrasoft.ComparisonType.EQUAL,
                                                "Contact.Id",
                                                UserId
                                        );
                                        esq.filters.addItem(filter);
                                        esq.getEntityCollection(
                                                function(response) {
                                                        if (response.collection.getCount() !== 1) {
                                                                this.scope.log("(getRelAU) Target Contact is not associated with User", Terrasoft.LogMessageType.ERROR);
                                                        } else {
                                                                this.mainLogick(response.collection.getByIndex(0).values.Id, this.callback);
                                                        }
                                                },
                                                {
                                                        scope: scope,
                                                        mainLogick: wrapOfMainLogick,
                                                        callback: callback
                                                }
                                        );
                                } else {
                                        wrapOfMainLogick(UserId, callback);
                                }
                        },
                        "checkUserInAU": function(AUname, AUtype, UserId, callback, scope) {
                                if (typeof AUtype === "function" && UserId === undefined) {
                                        callback = AUtype;
                                        AUtype = "ALL";
                                        if (typeof UserId === "object") {
                                                scope = UserId;
                                        }
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId === "function") {
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                        callback = UserId;
                                        UserId = Terrasoft.core.enums.SysValue.CURRENT_USER.value;
                                }
                                if (typeof UserId !== "object") {
                                        scope = this;
                                }
                                this.getRelAU(UserId, function(result) {
                                        var CompareResult = false;
                                        switch (this.AUtype) {
                                                case "OU":
                                                        for (var OU in result.OrgUnits) {
                                                                if (this.AUname === result.OrgUnits[OU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "FR":
                                                        for (var FU in result.FuncRoles) {
                                                                if (this.AUname === result.FuncRoles[FU].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                case "ORG":
                                                        for (var orgIndex in result.Organizations) {
                                                                if (this.AUname === result.Organizations[orgIndex].name) {
                                                                        CompareResult = true;
                                                                }
                                                        }
                                                        break;
                                                default:
                                                        for (var each in result) {
                                                                for (var subarray in result[each]) {
                                                                        if (this.AUname === result[each][subarray].name) {
                                                                                CompareResult = true;
                                                                        }
                                                                }
                                                        }
                                                        break;
                                        }
                                        this.callback.call(this.scope, CompareResult);
                                }, {
                                        scope: scope,
                                        AUtype: AUtype,
                                        AUname: AUname,
                                        callback: callback
                                });
                        },
                        "getUsersFromRole": function(RoleId, getManager, callback, scope) {
                                var getManagerFlag = false, filter = Terrasoft.createFilterGroup(), esq;
                                if (typeof getManager === "function") {
                                        callback = getManager;
                                        if (typeof callback === "object") {
                                                scope = callback;
                                        }
                                } else {
                                        getManagerFlag = getManager;
                                }
                                if (typeof scope !== "object") {
                                        scope = this;
                                }
                                if (getManagerFlag) {
                                        filter.logicalOperation = Terrasoft.LogicalOperatorType.AND;
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysAdminUnit"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "ParentRole",
                                                        RoleId
                                                )
                                        );
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysAdminUnitTypeValue",
                                                        2
                                                )
                                        );
                                        esq.addColumn("Name");
                                } else {
                                        esq = Ext.create("Terrasoft.EntitySchemaQuery", {
                                                rootSchemaName: "SysUserInRole"
                                        });
                                        filter.addItem(
                                                this.Terrasoft.createColumnFilterWithParameter(
                                                        this.Terrasoft.ComparisonType.EQUAL,
                                                        "SysRole",
                                                        RoleId
                                                )
                                        );
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Name", "UserName");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Id", "UserId");
                                        esq.addColumn("[SysAdminUnit:Id:SysUser].Contact", "Contact");
                                }
                                esq.filters.addItem(filter);
                                esq.getEntityCollection(
                                        function(response) {
                                                var cleanArray = [];
                                                if (this.getManagerFlag) {
                                                        this.scope.getUsersFromRole(
                                                                response.collection.getByIndex(0).values.Id,
                                                                this.callback,
                                                                this.scope
                                                        );
                                                } else {
                                                        response.collection.each(function(elem) {
                                                                elem.values.Id = elem.values.UserId;
                                                                delete elem.values.UserId;
                                                                cleanArray.push(elem.values);
                                                        });
                                                        this.callback.call(this.scope, cleanArray);
                                                }
                                        }, {
                                                scope: scope,
                                                callback: callback,
                                                getManagerFlag: getManagerFlag
                                        }
                                );
                        }
                });
        });

Нравится

7 комментариев

Здравствуйте!

Полезная информация, спасибо.

код миксина обновлен (исправлены некоторые проблемы, добавлены некоторые решения), MD-файл из приложений убрал он не актуален.
берите код из листинга в теме.

примеры для вызова getRelAU

//Получаем результирующий объект для текущего пользователя
this.getRelAU(
         function(result) {
                console.log(result);
         }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
         function(result) {
                console.log(result);
         }
, context);
//Получаем результирующий объект для пользователя с id "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D"
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
   function(result) {
        console.log(result);
    }
);
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "9D3B1042-9E88-499F-B13F-3E7F7F3FAD7D",
    function(result) {
        console.log(result);
    }
, context);
//Получаем результирующий объект для пользователя связанного с контактом id которого "E7D525FB-88EE-4947-94CC-D013E85D2F79"
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true
 );
//Тот же вызов, но с явным определением контекста для callback-функции
this.getRelAU(
    "E7D525FB-88EE-4947-94CC-D013E85D2F79",
    function(result) {
        console.log(result);
    },
    true,
    context
);

в схему корректно не выгружается кириллица, а поскольку в SysAdminUnitType одна только "Функциональная роль" названа кириллицей.
То после импорта схемы посмотрите в исходник, там где "кракозебры" замените на "Функциональная роль"
Будет время, обновлю MD-корректный

                      

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

Севостьянов Илья Сергеевич,

подскажите, пожалуйста, что за UserUtilsMixinResources передается в зависимости? его нужно создать отдельно?

define("UserUtilsMixin", ["UserUtilsMixinResources"]

 

создала у себя миксин, но без этого UserUtilsMixinResources, а также изменив названия миксина в 3 местах. когда его подключаю в своем клиентском модуле, выходит ошибка.

Есть какие-то особенности при этого подключении миксина?

UserUtilsMixinResources, это имя модуля + Resources стандартная мнемоника для объявления ресурсов в зависимостях для схем.

в 3-х местах это в каких ?

Показать все комментарии

В системе введено 2 сущности: элементы организационной структуры "Орг.юниты" и "Функциональные роли", в каждую из них по отдельности можно включать пользователей, и друг друга.
Причем включение одной сущности в другую создает реверс-тождественную связь (Добавление Функ.роли в Орг.Юнит равнозначно добавлению Орг.Юнита в Функ.Роль, эти связи вне зависимости от направления даже описываются в одной таблице).
Так вот, логично было бы предположить что данное разделение для обеспечения многопользовательского режима в приложении имеет смысл на уровне предоставления прав доступа, но эксперимент показывает весьма непредсказуемое поведение:
Пользователь А включен в Функц.Роль B которая в свою очередь включена в Орг.Юнит C.
В настройках прав доступа, например на объект "Контакты", установлено запрещающее правило на "Чтение", что фактически скрывает раздел для Орг.Юнита C.
Логическая цепочка: Пользователю A, раздел контакты станет недоступен, т.к. он входит в Функ.Роль B которая в свою очередь входит в Орг.юнит С, которому запрещено чтение по объекту "Контакты".
Фактически: Пользователю A - остается доступен раздел "Контакты", и ограничение он получает только если будет непосредственно включен в Орг.Юнит C
т.е. ограничения распостраняются только на пользователей непосредственно включенных в соответствующую Функ.роль или Орг.Юнит, через включение их друг в друга пользователям не наследуются никакие разрешения целевой группы, так же как и пользователям целевой что либо от включаемой.

А теперь самый главный вопрос: Зачем ?!
Какой смысл в 2-х сущностях, и в возможности их связи друг с другом, если это ни коим образом не связано с наследованием предоставленных разрешений ?!
И зачем вообще тогда нужны Функциональные роли...
В чем вообще "соль" обособленности Орг.Юнитов и Функ.Ролей ?

Нравится

3 комментария

Здравствуйте, Илья.

Можем предположить, что в описанной вами ситуации у пользователя А есть доступ к разделу по причине того, что данный пользователь может входить в дргую функциональную роль, которой доступ к данному разделу не запрещен, либо явно разрешен и данная запись является выше по приоритету (расположена вверху).

Ответы на ваши вопросы вы можете найти в статьях на Академии: https://academy.terrasoft.ru/documents/sales-team/7-9/razdel-upravleniy…
https://academy.terrasoft.ru/documents/sales-team/7-9/stranica-organiza…
https://academy.terrasoft.ru/documents/sales-team/7-9/stranica-funkcion…

Также, рекомендуем вам просмотреть видео:
https://www.youtube.com/watch?v=mSWfz61NKFI
https://www.youtube.com/watch?v=x5C6VcOhKj4

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

Ну с членством в другой функ.роли которой явно разрешено и разрешающее правило расположено выше - понятно.

а вот тут, прошу пару слов пояснения:

"Мария Ватулина" написал:входить в дргую функциональную роль, которой доступ к данному разделу не запрещен

Т.е. включая пользователя в Орг.юнит или Функ.роль которой явно что-то не запрещено, все связанные явно заданные запрещающие правила всех других включений для пользователя - не применяются ?

Илья,

прошу прощения, не корректно написала.
В системе то, что явно не запрещено, то разрешено. В данной ситуации нужно обратить внимание на расположение записи при настройке прав (приоритет), на то, в какие еще организационные и функциональные роли входит данный пользователь и как именно для них настроены права.

Рекомендуем ознакомиться с видео (ссылки указаны выше), там озвучены все нюансы настройки прав доступа для Организационных и Функциональных ролей.

Показать все комментарии

Продолжаем выпускать видеоуроки по настройке системы. В данном видеоуроке вы узнаете о назначении организационных и функциональных ролей, а также о том, как выполнить их настройку в bpm'online.

Видео доступно по ссылке: Формирование организационной структуры и функциональных ролей

Больше видеоуроков для старта работы с bpm'online доступно на академии Terrasoft.

Нравится

Поделиться

0 комментариев
Показать все комментарии

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

Организационная роль является элементом организационной структуры компании, ее подразделением, например, “Отдел продаж московского филиала” или “HR-отдел киевского филиала”.

Функциональная роль отражает должность, которую сотрудник занимает в компании, например,
роль “Менеджеры по продажам”.

Функциональная роль может включать в себя ряд организационных ролей. Например, в
функциональную роль “Менеджеры по продажам” могут входить организационные роли “Отдел
продаж московского филиала” и “Отдел продаж киевского филиала”.

Используя функциональные роли, вы можете настроить одинаковые права доступа для всех
сотрудников, которые занимают определенную должность, независимо от того, в каком
подразделении компании они работают. Например, вы можете предоставить доступ к разделу
[Продажи] для менеджеров по продажам, работающим в московском в киевском филиале
компании.

Чтобы предоставить доступ к разделу системы для определенной функциональной роли:

1.   Добавьте и настройте функциональную роль.

2.   Предоставьте доступ к объекту для добавленной функциональной роли.

Как добавить и настроить функциональную роль

Предположим, вам необходимо предоставить доступ к разделу [Продажи] для менеджеров
по продажам, работающим в московском и киевском филиалах компании. Для этого:

1.   Из дизайнера системы перейдите в раздел управления ролями и пользователями,
нажав на ссылку [Функциональные роли].

2.   На странице раздела нажмите на кнопку [Добавить]. На появившейся странице функциональной
роли определите ее параметры:

a.   Введите название роли, например, “Менеджеры по продажам”.

b.   На детали [Организационные роли] добавьте организационные роли, которые должны
входить в данную функциональную роль, например, “Отдел продаж московского филиала”
и “Отдел продаж киевского филиала”.

На заметку

Если доступ к разделу дополнительно требуется предоставить отдельным пользователям,
не входящим в добавленные организационные роли, добавьте необходимых пользователей
на детали [Пользователи].

Если необходимо определить список диапазонов IP-адресов, с которых пользователям
и их руководителям будет разрешен вход в систему, используйте деталь [Диапазон разрешенных
IP-адресов] вкладки [Правила доступа].

c.   Закройте страницу записи.

3.   Актуализируйте настроенные роли. Для этого в меню действий раздела выберите
команду [Актуализировать роли].

Актуализация ролей

Актуализация ролей

В результате в систему будет добавлена новая функциональная роль “Менеджеры по продажам”,
включающая в себя менеджеров по продажам московского и киевского филиалов.

Как предоставить доступ к разделу

Чтобы предоставить доступ к разделу:

1.   Перейдите в раздел [Доступ к объектам], используя ссылку [Права доступа на объекты]
дизайнера системы.

2.   В списке раздела выберите необходимый объект, например, “Продажа”. Объект должен
администрироваться по операциям. Если администрирование по операциям отключено, установите
признак в колонке [Администрируется по операциям] для выбранного объекта. Обратите
внимание, что установка признака может занять некоторое время.

3.   Перейдите на деталь [Доступ к объекту].

4.   Нажмите на кнопку [Добавить] панели инструментов детали и в открывшемся окне
добавьте роль, для которой будет предоставлен доступ к разделу, например, роль “Менеджеры
по продажам”.

В результате на деталь будет добавлена роль “Менеджеры по продажам”, пользователи
которой смогут читать, добавлять, изменять и удалять данные раздела [Продажи]. Если
необходимо запретить какую-либо из этих операций, например, удаление записей, установите
запрет на удаление в соответствующей колонке.

Если отдельные пользователи входят в несколько ролей одновременно, например, при
совмещении должностей, и если для таких ролей определены разные права доступа, то
будут применены права тех ролей, которые находятся выше в списке.

Например,  сотрудник одновременно входит в роль “Менеджеры по продажам” и “Менеджеры
поддержки продаж”. Для роли “Менеджеры поддержки продаж” определено право только
на чтение раздела [Продажи], а для роли “Менеджеры по продажам” — право на все операции.
Чтобы сотрудник получил максимальные права доступа, переместите роль “Менеджеры по
продажам” так, чтобы она оказалась выше роли “Менеджеры поддержки продаж”. В результате
пользователь получит доступ к разделу [Продажи] в соответствии с правами, определенными
для роли “Менеджеры по продаже”, а не “Менеджеры поддержки продаж”.

Для перемещения ролей в списке используйте кнопки [Вверх] и [Вниз] панели инструментов
детали.

Нравится

Поделиться

0 комментариев
Показать все комментарии