AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.03.2015, 20:23   #1  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Каскадирование прав программно
Всем доброго времени суток. Столкнулся с задачей, по которой нужно каскадировать выбранные права формы, на все внутренние объекты формы программно.

То есть для формы нужно запретить пункт меню, а потом проэмулировать нажатие кнопки Каскад, по которому все пункты меню, таблицы из этой формы также станут недоступными (то есть в accessRightList по ним добавятся записи).

Если с запретом самого пункта меню проблем нет, то каскадирование завязано полностью на дереве, которое строится на форме прав.

Отсюда вопрос, кто нибудь сталкивался с подобным вопросом?
Потому как кроме как создавать новую форму, делать на ней дерево и нажимать кнопку Каскад пока вариантов не вижу.
Старый 26.03.2015, 22:27   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Вопрос про AX 2009? Откуда такая постановка задачи? Права доступа в общем случае настраиваются для "точек входа", одними из которых являются пункты меню. Если закрывается доступ к пункту меню, то зачем каскадом закрывать доступ на таблицы и прочая? Что если одна и та же форма доступна через несколько пунктов меню (те же ценовые соглашения, например), и доступ закрывается только для некоторых из них? С "каскадом" вы неявно отключите доступ и через другие пункты меню.
Старый 27.03.2015, 07:12   #3  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Да в 2009. Такая необходимость возникла по причине возможной доступности пункта меню для других групп пользователей. То есть, если пункт меню становится доступным, чтобы система ругалась при открытии на доступ.
Старый 27.03.2015, 09:06   #4  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2155 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
А в других группах пользователей "каскад" по менюайтему не "включен"? Задача не стала более понятной. Начните с общего - чего хотят пользователи?
__________________
Ivanhoe as is..
Старый 27.03.2015, 09:11   #5  
IvanS is offline
IvanS
Участник
Аватар для IvanS
 
241 / 44 (2) +++
Регистрация: 30.06.2006
Адрес: Екатеринбург
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
А в других группах пользователей "каскад" по менюайтему не "включен"? Задача не стала более понятной. Начните с общего - чего хотят пользователи?
Мне задачу ставит уже опытный аналитик
Как я понял, если пункт меню доступен в одной группе, а не доступен в другой. А пользователь входит в обе группы, то при нажатии на форму была ругань на доступ.
В общем на данный момент просто решил добавить строки в права с запретом доступа на сами таблицы.
Старый 27.03.2015, 09:52   #6  
Lanai is offline
Lanai
Участник
 
35 / 29 (1) +++
Регистрация: 09.08.2005
Я правильно понял, что необходим код, которому передаем форму и AccessType, а он запустит каскадно установку этого AccessType для этой формы?

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

Вот методы на SysSecurityUserGroup ():

Этот бегает по объектам формы (таблицы и MenuItem) и устанавливает им права:

X++:
void grantSubAccessForForm(   FormName      _formName,
                              AccessType    _access)
{
    SysDictMenu             sysDictMenu;
    TreeNodePath            treeNodePath;
    MenuFunction            menuFunction;
    FormName                formName;
    List                    list;
    Map                     map;

    ListEnumerator          enumerator;
    MapEnumerator           mapEnumerator;
    SysDictTable            dictTable;
    MenuFunction            menu;
    
    ;

    treeNodePath = strFmt("\\Menu Items\\%1\\%2", enum2str(MenuItemType::Display), _formName);
    sysDictMenu  = SysDictMenu::newTreeNodePath(treeNodePath);

    if (sysDictMenu)
    {
        menuFunction = sysDictMenu.menuItem();

        if (menuFunction && SysSecurity::potentialChildren(menuFunction))
        {
            switch (menuFunction.objectType())
            {
                case UtilElementType::Form:
                    formName = menuFunction.object();
                    list = SysSecurity::getFormDatasources(formName);
                    map  = SysSecurity::getFormDisplayMethods(menuFunction);

                    if (list.elements())
                    {
                        enumerator  = list.getEnumerator();

                        while (enumerator.moveNext())
                        {
                            dictTable   = new SysDictTable(enumerator.current());
                            this.accessChangedForTable(dictTable.name(), _access);
                        }
                    }

                    list = SysSecurity::getFormMenuItems(formName);

                    if (list.elements())
                    {
                        enumerator = list.getEnumerator();
                        while (enumerator.moveNext())
                        {
                            switch (classidget(enumerator.current()))
                            {
                                case classnum(Map):

                                map = enumerator.current();

                                mapEnumerator = map.getEnumerator();

                                mapEnumerator.moveNext();

                                switch (classidget(mapEnumerator.currentValue()))
                                {
                                    case classnum(MenuFunction):
                                        menu = mapEnumerator.currentValue();
                                        this.accessChangedForMenuItem(menu.name(), menu.type(), _access);
                                    break;
                                }
                            }
                        }
                   }

                   break;
            }
        }
    }
}

для установки прав для таблицы:

X++:
void accessChangedForTable(TableName    name, AccessType access)
{
    DictTable                   dictTable;
    TableId                     tableId;
    ;
    if (access != AccessType::NoAccess)
    {
        tableId = tableName2Id(name);
        dictTable = new DictTable(tableId);
        if (access > dictTable.maxAccessMode())
            access = dictTable.maxAccessMode();
    }

    EePersonalDataAccessLogging::logTableAccessChange(
        tableId,
        securitySet.tableAccess(tableId),
        access,
        this.parmUserGroupId());

    securitySet.tableAccess(tableId, access);
    origtableAccess.insert(tableId, access);
}

для установки прав на MenuItems

X++:
void accessChangedForMenuItem(  MenuItemName        name,
                                    MenuItemType        type,
                                    AccessType          access)
{
    ;
    securitySet.secureNodeAccess(name, SysSecurity::menuItemType2UtilElementType(type), access);
}

На всякий случай приблизительный вариант как работать с SysSecurityUserGroup:

X++:
    SysSecurityUserGroup                sysSecurity = SysSecurityUserGroup::construct();

    sysSecurity.parmUserGroupId(userGroupId);
    sysSecurity.parmDomainId(domainId);
    sysSecurity.load();

    sysSecurity. grantSubAccessForForm("SalesTable", AccessType::Delete);

    sysSecurity.save();
Старый 27.03.2015, 10:00   #7  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Цитата:
Сообщение от IvanS Посмотреть сообщение
Мне задачу ставит уже опытный аналитик
Как я понял, если пункт меню доступен в одной группе, а не доступен в другой. А пользователь входит в обе группы, то при нажатии на форму была ругань на доступ.
Хм. Реализация поведения AccessDenied в Аксапте? Вместо правильного проектирования групп, с включением в группе только дополнительных ключей и прав доступа на объекты, создание инструмента, который обернется пшиком в следующих версиях AX?
Подумайте, а как будет вести себя ваш инструмент, если обработка прав прописана в коде, т.е. если в зависимости от уровня доступа изменяется "активность" объектов.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Добавление прав пользователям программно Vasil DAX: Программирование 8 27.12.2013 14:22
Архитектура прав доступа vazerdim DAX: Администрирование 4 07.10.2011 17:16
Распознание прав программно DreamCreator DAX: Программирование 22 03.03.2006 16:26
при построении перекрёстных ссылок выдаётся сообщение об ошибках mmmax DAX: Программирование 10 21.01.2005 12:42
Проблемы настройки прав доступа пользователям axot DAX: Администрирование 25 16.05.2002 10:47

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:35.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.