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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.12.2011, 22:08   #1  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Просто поделюсь опытом, может кому-нибудь пригодится.

Дано:
  • AX 4.0 SP2, версия ядра 4.0.2503.116;
  • ~450 групп пользователей;
  • 10 доменов.

Задача:
  • отключить доступ к одному отчету у всех групп.

Выполняется очееень долго (~4-9 часов) и не всегда завершается успешно. Оптимизировать времени не было, поэтому и хотфикс не выкладываю, а лишь делюсь опытом :-).
За это сообщение автора поблагодарили: Pustik (3).
Старый 03.12.2011, 13:49   #2  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,496 / 1071 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Выполняется очееень долго (~4-9 часов) и не всегда завершается успешно. Оптимизировать времени не было, поэтому и хотфикс не выкладываю, а лишь делюсь опытом :-).
А чего так долго? Открываем таблицу AccessRightList и удаляем там руками записи с именем MenuItem-а данного отчета (это если в компании принято давать права на объекты, а не на ключи доступа). Если права даны на ключи, то пишем job, который для групп с ключами, добавит запись с отключением доступа к отчету.
Или просто на MenuItem данного отчета вешаем другой ключ.
Или в коде отчета делаем проверку на ключ и закрываем его, если нет доступа.
Есть масса вариантов что бы потратить ~4-9 часов более разумно.
За это сообщение автора поблагодарили: gl00mie (2), Kabardian (1).
Старый 03.12.2011, 18:19   #3  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
Цитата:
Сообщение от raz Посмотреть сообщение
А чего так долго? Открываем таблицу AccessRightList и удаляем там руками записи с именем MenuItem-а данного отчета (это если в компании принято давать права на объекты, а не на ключи доступа). Если права даны на ключи, то пишем job, который для групп с ключами, добавит запись с отключением доступа к отчету.
Или просто на MenuItem данного отчета вешаем другой ключ.
Или в коде отчета делаем проверку на ключ и закрываем его, если нет доступа.
Есть масса вариантов что бы потратить ~4-9 часов более разумно.
Спасибо за много разных и интересных вариантов :-), но были причины:
  • отчетов было много (больше 100);
  • нужно было обойтись с минимумом разработки, чтобы не тратить много времени на тестирование.
Из предложенных вариантов, не вижу какого-то одного универсального, чтобы он сработал на случай, когда я не знаю как в компании принято давать права на объекты .

Используя подход описанный на Axaptapedia, написал джоб для массового отключения прав доступа к menuitem, чуть позже выложу его здесь.
Старый 06.12.2011, 22:30   #4  
Kabardian is offline
Kabardian
Талантливый разгвоздяй
Аватар для Kabardian
 
424 / 338 (12) ++++++
Регистрация: 14.12.2008
Адрес: Москва
Записей в блоге: 14
!
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Спасибо за много разных и интересных вариантов :-), но были причины:
  • отчетов было много (больше 100);
  • нужно было обойтись с минимумом разработки, чтобы не тратить много времени на тестирование.
Используя подход описанный на Axaptapedia, написал джоб для массового отключения прав доступа к menuitem, чуть позже выложу его здесь.
Будьте предельно осторожны с джобом по ссылке! Последствия в моем случае:
  • слетели права доступа для многих групп пользователей к различным таблицам
  • значительно замедлилась система


Использовал оттуда кусок кода для каждого сочетания группа + домен:
X++:
void disableMenuItems(SecurityKeySet _securitySet)
    {
        str name;
        AccessRecordType recordType;
        int idx;
        AccessType accessType;
        for (idx = 1; idx <= conLen(menuItems); idx++)
        {
            [name, recordType] = conpeek(menuItems, idx);
            accessType = _securitySet.menuItemAccess(name, recordType);
            if (accessType!= AccessType::NoAccess)
            {
                info(strFmt('%1:%2, %3', name, recordType, accessType));
                _securitySet.menuItemAccess(name, recordType, AccessType::NoAccess);
            }
        }
    }

Пока точная причина неизвестна, тем не менее решил предупредить, мало ли вдруг все-таки этот джоб виноват .


Как выясню причину, сообщу.
За это сообщение автора поблагодарили: Logger (1).
Старый 24.01.2019, 10:09   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,981 / 3268 (116) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Kabardian Посмотреть сообщение
Будьте предельно осторожны с джобом по ссылке! Последствия в моем случае:
  • слетели права доступа для многих групп пользователей к различным таблицам
  • значительно замедлилась система


Пока точная причина неизвестна, тем не менее решил предупредить, мало ли вдруг все-таки этот джоб виноват .


Как выясню причину, сообщу.
причина в этой строке кода
X++:
xAccessRightsList::saveSecurityRights(securitySet.pack(), localGroup.Id, domain);
При ее использовании сохраняются все права для всех табличек и менюитемов. В моем случае получилось порядка 10 тысяч записей на одну группу прав. Конечно будет тормозить.
Также для большинства табличек прописывается NoAccess. Как правило приводит к тому что лукапы не работают.
Если написать так
X++:
xAccessRightsList::saveSecurityRights(securitySet.packTouched(), localGroup.Id, domain);
то все ок.
За это сообщение автора поблагодарили: S.Kuskov (5).
Старый 05.12.2011, 08:09   #6  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от raz Посмотреть сообщение
А чего так долго? Открываем таблицу AccessRightList и удаляем там руками записи с именем MenuItem-а данного отчета
Ага, а если у нас на родительский объект дан доступ > NoAccess, то с удивлением обнаруживаем, что отчет у пользователя не пропал.
Поэтому не советую трогать AccessRightsList руками.
__________________
ѣ
Старый 05.12.2011, 11:08   #7  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,496 / 1071 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Цитата:
Сообщение от maximka Посмотреть сообщение
Ага, а если у нас на родительский объект дан доступ > NoAccess, то с удивлением обнаруживаем, что отчет у пользователя не пропал.
Поэтому не советую трогать AccessRightsList руками.
Читайте всё сообщение внимательно.
Старый 05.12.2011, 11:23   #8  
maximka is offline
maximka
Сам.AX
Аватар для maximka
Самостоятельные клиенты AX
 
96 / 24 (1) +++
Регистрация: 26.10.2006
Адрес: Тюмень
Цитата:
Сообщение от raz Посмотреть сообщение
Читайте всё сообщение внимательно.
Ок, согласен.
Конкретно с отчетами этот вариант работает, но в общем случае, считаю, что не следует лезть в AccessRightsList.
__________________
ѣ
Теги
axapta, законченный пример, полезное, права доступа, программно

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
права доступа Himan DAX: Функционал 9 24.09.2010 16:52
Права доступа Группы пользователей к таблице ta_and DAX: Администрирование 2 19.01.2009 15:19
Права доступа на поля формы. AlexeyBP DAX: Функционал 6 12.12.2006 12:02
Как программно изменить к-во в строке заказа в форме SalesTable BorDark DAX: Программирование 2 13.01.2005 17:02
Права доступа - Журнал платежей SDA DAX: Прочие вопросы 1 20.09.2004 23:10
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:59.