26.03.2015, 20:23 | #1 |
Участник
|
Каскадирование прав программно
Всем доброго времени суток. Столкнулся с задачей, по которой нужно каскадировать выбранные права формы, на все внутренние объекты формы программно.
То есть для формы нужно запретить пункт меню, а потом проэмулировать нажатие кнопки Каскад, по которому все пункты меню, таблицы из этой формы также станут недоступными (то есть в accessRightList по ним добавятся записи). Если с запретом самого пункта меню проблем нет, то каскадирование завязано полностью на дереве, которое строится на форме прав. Отсюда вопрос, кто нибудь сталкивался с подобным вопросом? Потому как кроме как создавать новую форму, делать на ней дерево и нажимать кнопку Каскад пока вариантов не вижу. |
|
26.03.2015, 22:27 | #2 |
Участник
|
Вопрос про AX 2009? Откуда такая постановка задачи? Права доступа в общем случае настраиваются для "точек входа", одними из которых являются пункты меню. Если закрывается доступ к пункту меню, то зачем каскадом закрывать доступ на таблицы и прочая? Что если одна и та же форма доступна через несколько пунктов меню (те же ценовые соглашения, например), и доступ закрывается только для некоторых из них? С "каскадом" вы неявно отключите доступ и через другие пункты меню.
|
|
27.03.2015, 07:12 | #3 |
Участник
|
Да в 2009. Такая необходимость возникла по причине возможной доступности пункта меню для других групп пользователей. То есть, если пункт меню становится доступным, чтобы система ругалась при открытии на доступ.
|
|
27.03.2015, 09:06 | #4 |
Участник
|
А в других группах пользователей "каскад" по менюайтему не "включен"? Задача не стала более понятной. Начните с общего - чего хотят пользователи?
__________________
Ivanhoe as is.. |
|
27.03.2015, 09:11 | #5 |
Участник
|
Цитата:
Как я понял, если пункт меню доступен в одной группе, а не доступен в другой. А пользователь входит в обе группы, то при нажатии на форму была ругань на доступ. В общем на данный момент просто решил добавить строки в права с запретом доступа на сами таблицы. |
|
27.03.2015, 09:52 | #6 |
Участник
|
Я правильно понял, что необходим код, которому передаем форму и 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 |
Злыдни
|
Цитата:
Подумайте, а как будет вести себя ваш инструмент, если обработка прав прописана в коде, т.е. если в зависимости от уровня доступа изменяется "активность" объектов.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании. |
|