02.11.2011, 16:17 | #1 |
NavAx
|
Настройка прав доступа в DAX2009
Хочу спросить общественность: Кто как настраивает права в DAX2009?
Мы дошли до этого шага и моему "удивлению" не было предела. Так все испортить... Куча таблиц имеет ключи доступа отличные от МодульTable. Половина tmp-шных таблиц имеет ключи доступа. А самое "веселое", все лукапы теперь не работают, нужно давать права к справочникам. Я в шоке. Может я чего то напутал и есть нормальный способ настройки прав? Или все просто тупо дают на просмотр все таблицы? |
|
02.11.2011, 17:01 | #2 |
Участник
|
Нет, все так.
Кстати, раздать права на таблицы с лукапами - это самая легко решаемая задача. Что то обсуждалось тут... Как правильно создавать новые и использовать существующие SecurityKey Последний раз редактировалось someOne; 02.11.2011 в 17:05. |
|
02.11.2011, 17:04 | #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 |
NavAx
|
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 |
Участник
|
1. На сами ключи права не давать. Тут ничего не менялось.
2. С tmp таблиц ключи снимать, где возможно. Тоже самое было и раньше. 3. Если никак не снять ключ - AllowCheck = No на форме. И раньше так было. 4. Для лукапов, считаю, правильно явно давать права на соответствующие таблицы. С common - первый раз неочевидно, второй раз уже просто имеешь в виду. Неверно повешанные ключи, конечно, бесят.
__________________
Ivanhoe as is.. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
03.11.2011, 08:34 | #6 |
Участник
|
Мы в принципе поступали точно так же. Шли от Главного меню. Потом тестировали и сюрпризы в виде common отдельно записывали. И для настройки следующих групп это учитывали. Я бы еще добавил, что по возможности мы делали AOSAuthorization = None, поскольку в некоторых случаях даже дав полные права на таблицу не помогало. Пример: ProjItemTrans был разрешен для пользователя по максимуму, но пересчеты не проходили. Система ругалась на недостаточность прав именно для этой таблицы. Сняв AOSAuthorization все заработало.
Прикрепляю проект, который скачал на этом форуме. Искал ссылку, хотел скинуть ее, но так и не нашел(Еще раз Респект Автору). Он позволяет запускать Аксапту 2009 от имени пользователя прямо из справочника пользователей, стоя на конкретном пользователе. Очень удобно для тестирования настройки прав, да и вообще по работе
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. Последний раз редактировалось Pustik; 03.11.2011 в 08:38. |
|
|
За это сообщение автора поблагодарили: Logger (3). |
03.11.2011, 10:11 | #7 |
Axapta
|
|
|
|
За это сообщение автора поблагодарили: Pustik (1). |