25.12.2008, 11:44 | #1 |
Участник
|
Разграничение прав доступа к записям таблицы
Здравствуйте.
Есть такая задача. Необходимо настроить права доступа пользователей таким бразом чтобы видеть пользователи могли все записи. А редактировать только те, которые были созданы конкретным пользователем. Конкретно речь идет о таблице клиентов. Менеджеры будут видеть всех клиентов. Но вносить изменения должны иметь возможность только в карточки своих клиентов ( у которых они проставлены как "ответственные"). Не очень понимаю как это сделать. Можно настроить для каждого пользователя свою группу чтобы он видел и редактировал только своих. А вот как сделать чтобы он видел и остальных, но не редактировал? Прошу прощения, если тема уже была на форуме. Поискал - не нашел. Если знаете - киньте ссылку на ветку. Работаю в 3-ке. |
|
25.12.2008, 12:23 | #2 |
Moderator
|
Насколько я понимаю, RLS тут использовать не получится, поэтому посмотрите, как сделано в форме LedgerJournalTable, конкретно - метод active в датасорсе. Там вопрос "разрешать редактировать или нет" решается по значению поля posted (разнесено). Соответственно, у вас вместо этого будет проверка, является ли текущая запись - записью, созданной текущим пользователем. Остальное - по аналогии.
|
|
25.12.2008, 12:25 | #3 |
Участник
|
Цитата:
На источнике данных CustTable перекрыть метод active(): X++: #Admin public int active() { boolean allowEdit ; int ret = super() ; allowEdit = UserInfoHelp::userInUserGroup( curUserId(), #AdminUserGroup ) || CustTable.<"ответстенный"> == curUserId() ; CustTable_ds.allowEdit( allowEdit ) ; return ret; } |
|
25.12.2008, 13:12 | #4 |
Участник
|
|
|
25.12.2008, 13:14 | #5 |
Участник
|
|
|
25.12.2008, 13:53 | #6 |
Участник
|
Лучше все-таки сделать SecurityKey чем хардкодить группу
X++: #Admin public int active() { boolean allowEdit ; int ret = super() ; allowEdit = hasSecurityKeyAccess(securityKeyNum(CustEditOthersCustomers_ZED), AccessType::Read) || CustTable.<"ответстенный"> == curUserId() ; CustTable_ds.allowEdit( allowEdit ) ; return ret; } |
|
25.12.2008, 14:37 | #7 |
Участник
|
|
|
25.12.2008, 14:43 | #8 |
Administrator
|
При всей банальности - возражу - что это не "по-системному".
Во-первых, тут ведь добавлено поле "Код пользователя", а не "Код группы". И помимо функции доступа - это поле несет в себе информацию кто за что ответственен. А во-вторых - обращаю внимание, что в буржуйском функционале (если не рассматривать локализацию) - на каждый модуль фиксированное кол-во ключей доступа - Ежедневные операции, запросы, отчеты, таблицы, настройки и разное. Например доступ к журналам прописывается через группы, которые указываются в настройках, а не через ключи доступа. Это очень хорошо видно, когда в роли настройщика прав сталкиваешься с задачей настроить права. С первого взгляда догадаться - "А на что влияет этот ключик" - нереально в принципе. Это надо знать. А в дереве ключей - такое недопустимо - там все права так или иначе понятны как раздаются. А вот "скрытые" права доступа задаются именно через группы. По крайне мере - так сделано в системе.
__________________
Возможно сделать все. Вопрос времени |
|
25.12.2008, 17:53 | #9 |
Участник
|
smmBusRelTable
Цитата:
Можно предварительно сохранить в переменную код текущего сотрудника при открытии формы: ClassDeclaration формы: X++: class FormRun extends ObjectRun { ... EmplId currentContactId ; ... } X++: void init()
{
...
currentContactId = smmUtility::getCurrentContact() ;
...
} X++: #Admin int active() { boolean allowEdit ; ... allowEdit = UserInfoHelp::userInUserGroup( curUserId(), #AdminUserGroup ) || // администраторы могут править все? ( currentContactId && ( smmBusRelTable.MainContact == currentContactId // если возможность править записи с неуказанным ответственным не нужна - закоментировать строку ниже || !smmBusRelTable.MainContact ) ) ; smmBusRelTable_ds.allowEdit( allowEdit ) ; ... } X++: #Admin int active() { boolean allowEdit ; ... allowEdit = UserInfoHelp::userInUserGroup( curUserId(), #AdminUserGroup ) || // администраторы могут править все? ( smmBusRelTable.MainContact == currentContactId // если возможность править записи с неуказанным ответственным не нужна - закоментировать строку ниже || !smmBusRelTable.MainContact ) ; smmBusRelTable_ds.allowEdit( allowEdit ) ; ... } |
|
|
За это сообщение автора поблагодарили: mdconsult (1). |
25.12.2008, 18:18 | #10 |
Участник
|
В стандарте есть особый ключик в ветке Admin и совсем уж нестандартная ветка ключей Business Connector Proxy. Как раз для разграничения доступа. DAX 4.0 SP2.
__________________
Ivanhoe as is.. |
|
26.12.2008, 09:43 | #11 |
Administrator
|
Цитата:
Есть права доступа, относящиеся к ядру системы (exe-шнику). Это разработка, администрирование, Бизнес-коннектор. Из них разработка и бизнес-коннектор не имеют своего меню. Администрирование - имеет - но у него и похожая структура. За исключением открытия доступа к домену (что тоже является свойством ядра в большей степени). Конфигуратор продукции подчинен разработке - т.к. сам является генератором кода. Все остальное имеет одинаковую структуру меню (исключая локализацию в т.ч. польские и чешские ключи). Поэтому общее правило - ориентироваться на то, как это сделано в большинстве функционала (особенно в sys-слое).
__________________
Возможно сделать все. Вопрос времени |
|
26.12.2008, 13:59 | #12 |
Участник
|
Большое спасибо всем, кто откликнулся и помогал советами.
Отдельное спасибо petergunn. Вставил проверку по пользователю и все заработало. |
|