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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.11.2011, 16:17   #1  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Angry Настройка прав доступа в DAX2009
Хочу спросить общественность: Кто как настраивает права в DAX2009?

Мы дошли до этого шага и моему "удивлению" не было предела.
Так все испортить...
Куча таблиц имеет ключи доступа отличные от МодульTable. Половина tmp-шных таблиц имеет ключи доступа. А самое "веселое", все лукапы теперь не работают, нужно давать права к справочникам.
Я в шоке.

Может я чего то напутал и есть нормальный способ настройки прав?
Или все просто тупо дают на просмотр все таблицы?
Старый 02.11.2011, 17:01   #2  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Нет, все так.

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

Что то обсуждалось тут...
Как правильно создавать новые и использовать существующие SecurityKey

Последний раз редактировалось someOne; 02.11.2011 в 17:05.
Старый 02.11.2011, 17:04   #3  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Нормальный способ - "плясать" от меню, а не давать права на конкретные ключи, т.е. на ключи вообще права не давать, кроме ряда случаев XxxTables, висящих на таблицах, для которых настроено AOSAuthorization; пример такой таблицы - EmplTable, там без доступа на ключ BasicTables ни формы не откроются, ни код, дергающий EmplTable::find(), не отработает. Для работы lookup'ов мы делали несложную модифу, которая при раздаче доступа на таблицу шерстит все relation'ы на таблице и EDT полей, ищет по ним "основные" таблицы и выдает на них доступ на чтение. Новые формы от этого доступны не станут, а вот lookup'ы заработают.

PS. Мне лично особенно понравилась работа, кажется, PurchTotals, где есть datasource по Common. На Common висит ключ AdminTables, при этом не помню, видна ли она вообще в списке таблиц, привязанных к ключу, соотв., без доступа на Common (либо AdminTables) форма не открывалась Решилось выставлением AllowCheck == No на datasource'е.

Последний раз редактировалось gl00mie; 02.11.2011 в 17:06.
Старый 02.11.2011, 17:33   #4  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
2 gloomie тоже пришлось нарисовать job, видимо придется прикрутить его к сохранению прав у группы.

X++:
static void edd_SetUpUserGroupSecurity(Args _args)
{
    UserGroupId         UserGroupId = '';
    AccessRightsList    AccessRightsList;
    AccessRightsList    AccessRightsList2Ins;

    DictField           DictField;
    DictTable           DictTable;
    DictType            DictType;
    DictRelation        DictRelation;

    FieldId             FieldId;
    ExtendedTypeId      ExtendedTypeId;
    TableId             TableId;
    int                 relationNum;
    ;
    while select AccessRightsList
        where AccessRightsList.groupId    == UserGroupId
           && AccessRightsList.recordType == AccessRecordType::Table
           && AccessRightsList.parentId   == 0
           && AccessRightsList.accessType >= AccessType::Edit
    {
        DictTable = new DictTable(AccessRightsList.id);

        if (DictTable)
        {
            DictRelation = new DictRelation(DictTable.id());

            for (relationNum = 1; relationNum <= DictTable.relationCnt(); relationNum++)
            {
                TableId = DictRelation.loadNameRelation(DictTable.relation(relationNum));

                if (TableId)
                {
                    select firstonly AccessRightsList2Ins
                        where AccessRightsList2Ins.groupId    == AccessRightsList.groupId
                           && AccessRightsList2Ins.domainId   == AccessRightsList.domainId
                           && AccessRightsList2Ins.recordType == AccessRecordType::Table
                           && AccessRightsList2Ins.parentId   == 0
                           && AccessRightsList2Ins.accessType >= AccessType::View
                           && AccessRightsList2Ins.id         == TableId;

                    if (!AccessRightsList2Ins)
                    {
                        AccessRightsList2Ins.groupId            = AccessRightsList.groupId;
                        AccessRightsList2Ins.domainId           = AccessRightsList.domainId;
                        AccessRightsList2Ins.recordType         = AccessRecordType::Table;
                        AccessRightsList2Ins.parentId           = 0;
                        AccessRightsList2Ins.accessType         = AccessType::View;
                        AccessRightsList2Ins.accessTypeFkeyUse  = AccessType::NoAccess;
                        AccessRightsList2Ins.id                 = TableId;
                        AccessRightsList2Ins.insert();

                        info(strfmt("%1", tableId2Name(TableId)));
                    }
                }
            }

            FieldId = DictTable.fieldNext(0);

            while (FieldId && ! isSysId(FieldId))
            {
                DictField = new DictField(DictTable.id(), FieldId);

                if (DictField && DictField.rights() >= AccessType::Edit)
                {
                    ExtendedTypeId = DictField.typeId();

                    if (ExtendedTypeId)
                    {
                        DictType = new DictType(ExtendedTypeId);

                        if (DictType)
                        {
                            DictRelation = DictType.relationObject();

                            if (DictRelation)
                            {
                                TableId = DictRelation.table();

                                if (TableId)
                                {
                                    select firstonly AccessRightsList2Ins
                                        where AccessRightsList2Ins.groupId    == AccessRightsList.groupId
                                           && AccessRightsList2Ins.domainId   == AccessRightsList.domainId
                                           && AccessRightsList2Ins.recordType == AccessRecordType::Table
                                           && AccessRightsList2Ins.parentId   == 0
                                           && AccessRightsList2Ins.accessType >= AccessType::View
                                           && AccessRightsList2Ins.id         == TableId;

                                    if (!AccessRightsList2Ins)
                                    {
                                        AccessRightsList2Ins.groupId            = AccessRightsList.groupId;
                                        AccessRightsList2Ins.domainId           = AccessRightsList.domainId;
                                        AccessRightsList2Ins.recordType         = AccessRecordType::Table;
                                        AccessRightsList2Ins.parentId           = 0;
                                        AccessRightsList2Ins.accessType         = AccessType::View;
                                        AccessRightsList2Ins.accessTypeFkeyUse  = AccessType::NoAccess;
                                        AccessRightsList2Ins.id                 = TableId;
                                        AccessRightsList2Ins.insert();

                                        info(strfmt("%1", tableId2Name(TableId)));
                                    }
                                }
                            }
                        }
                    }
                }

                FieldId   = DictTable.fieldNext(FieldId);
            }
        }
    }
}
За это сообщение автора поблагодарили: Logger (1), gl00mie (3).
Старый 02.11.2011, 19:03   #5  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
1. На сами ключи права не давать. Тут ничего не менялось.
2. С tmp таблиц ключи снимать, где возможно. Тоже самое было и раньше.
3. Если никак не снять ключ - AllowCheck = No на форме. И раньше так было.
4. Для лукапов, считаю, правильно явно давать права на соответствующие таблицы.

С common - первый раз неочевидно, второй раз уже просто имеешь в виду. Неверно повешанные ключи, конечно, бесят.
__________________
Ivanhoe as is..
За это сообщение автора поблагодарили: Logger (1).
Старый 03.11.2011, 08:34   #6  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Мы в принципе поступали точно так же. Шли от Главного меню. Потом тестировали и сюрпризы в виде common отдельно записывали. И для настройки следующих групп это учитывали. Я бы еще добавил, что по возможности мы делали AOSAuthorization = None, поскольку в некоторых случаях даже дав полные права на таблицу не помогало. Пример: ProjItemTrans был разрешен для пользователя по максимуму, но пересчеты не проходили. Система ругалась на недостаточность прав именно для этой таблицы. Сняв AOSAuthorization все заработало.
Прикрепляю проект, который скачал на этом форуме. Искал ссылку, хотел скинуть ее, но так и не нашел(Еще раз Респект Автору). Он позволяет запускать Аксапту 2009 от имени пользователя прямо из справочника пользователей, стоя на конкретном пользователе. Очень удобно для тестирования настройки прав, да и вообще по работе
Вложения
Тип файла: xpo SharedProject_SysRunAsAxInstance_VSUH.xpo (67.3 Кб, 365 просмотров)
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.

Последний раз редактировалось Pustik; 03.11.2011 в 08:38.
За это сообщение автора поблагодарили: Logger (3).
Старый 03.11.2011, 10:11   #7  
oip is offline
oip
Axapta
Лучший по профессии 2014
 
2,564 / 1416 (53) ++++++++
Регистрация: 28.11.2005
Записей в блоге: 1
Цитата:
Сообщение от Pustik Посмотреть сообщение
Искал ссылку, хотел скинуть ее, но так и не нашел(Еще раз Респект Автору).
Тестирование прав пользователей. DAX 4.0.
За это сообщение автора поблагодарили: Pustik (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Настройка прав доступа только для чтения Kabardian DAX: Администрирование 3 22.06.2009 10:41
Настройка прав доступа на уровне записей Pan DAX: Администрирование 19 12.11.2006 11:10
настройка прав доступа elenaka DAX: Администрирование 2 13.09.2005 16:03
при построении перекрёстных ссылок выдаётся сообщение об ошибках mmmax DAX: Программирование 10 21.01.2005 12:42
Настройка прав доступа к конкретной аналитике kalex DAX: Администрирование 3 20.08.2004 17:17

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

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

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