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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.12.2008, 11:44   #1  
mdconsult is offline
mdconsult
Участник
Злыдни
1C
 
46 / 10 (1) +
Регистрация: 08.08.2008
Адрес: СПб
? Разграничение прав доступа к записям таблицы
Здравствуйте.
Есть такая задача. Необходимо настроить права доступа пользователей таким бразом чтобы видеть пользователи могли все записи. А редактировать только те, которые были созданы конкретным пользователем. Конкретно речь идет о таблице клиентов. Менеджеры будут видеть всех клиентов. Но вносить изменения должны иметь возможность только в карточки своих клиентов ( у которых они проставлены как "ответственные").
Не очень понимаю как это сделать.
Можно настроить для каждого пользователя свою группу чтобы он видел и редактировал только своих. А вот как сделать чтобы он видел и остальных, но не редактировал?

Прошу прощения, если тема уже была на форуме. Поискал - не нашел. Если знаете - киньте ссылку на ветку.
Работаю в 3-ке.
Старый 25.12.2008, 12:23   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Насколько я понимаю, RLS тут использовать не получится, поэтому посмотрите, как сделано в форме LedgerJournalTable, конкретно - метод active в датасорсе. Там вопрос "разрешать редактировать или нет" решается по значению поля posted (разнесено). Соответственно, у вас вместо этого будет проверка, является ли текущая запись - записью, созданной текущим пользователем. Остальное - по аналогии.
Старый 25.12.2008, 12:25   #3  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
Цитата:
Сообщение от mdconsult Посмотреть сообщение
...
Но вносить изменения должны иметь возможность только в карточки своих клиентов ( у которых они проставлены как "ответственные").
...
Задача сводится к тому чтобы дать пользователю возможность редактировать записи по определенному условию?
На источнике данных 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  
mdconsult is offline
mdconsult
Участник
Злыдни
1C
 
46 / 10 (1) +
Регистрация: 08.08.2008
Адрес: СПб
Цитата:
Сообщение от Gustav Посмотреть сообщение
Насколько я понимаю, RLS тут использовать не получится, .
У меня тоже такое ощущение. Потому что пробовал и так, и эдак. Результат: "либо-либо".
Спасибо, сейчас попробуем.
Старый 25.12.2008, 13:14   #5  
mdconsult is offline
mdconsult
Участник
Злыдни
1C
 
46 / 10 (1) +
Регистрация: 08.08.2008
Адрес: СПб
Цитата:
Сообщение от petergunn Посмотреть сообщение
Задача сводится к тому чтобы дать пользователю возможность редактировать записи по определенному условию?
Именно. Если в поле "Ответственный" проставлен пользователь - он может редактировать запись. Если нет - только смотрит.

Сейчас попробую оба варианта.
Старый 25.12.2008, 13:53   #6  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Лучше все-таки сделать 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  
mdconsult is offline
mdconsult
Участник
Злыдни
1C
 
46 / 10 (1) +
Регистрация: 08.08.2008
Адрес: СПб
Цитата:
Сообщение от petergunn Посмотреть сообщение
На источнике данных CustTable перекрыть метод active():
Да, кстати, не указал, что меня интересует подобное разграничение на таблицу smmBusRelTable. Чтобы "Деловые отношения" модуля CRM менеджеры просматривали все, а редактировали только свои.
Старый 25.12.2008, 14:43   #8  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от belugin Посмотреть сообщение
Лучше все-таки сделать SecurityKey чем хардкодить группу
При всей банальности - возражу - что это не "по-системному".
Во-первых, тут ведь добавлено поле "Код пользователя", а не "Код группы". И помимо функции доступа - это поле несет в себе информацию кто за что ответственен.
А во-вторых - обращаю внимание, что в буржуйском функционале (если не рассматривать локализацию) - на каждый модуль фиксированное кол-во ключей доступа - Ежедневные операции, запросы, отчеты, таблицы, настройки и разное.
Например доступ к журналам прописывается через группы, которые указываются в настройках, а не через ключи доступа.

Это очень хорошо видно, когда в роли настройщика прав сталкиваешься с задачей настроить права. С первого взгляда догадаться - "А на что влияет этот ключик" - нереально в принципе. Это надо знать. А в дереве ключей - такое недопустимо - там все права так или иначе понятны как раздаются.
А вот "скрытые" права доступа задаются именно через группы.

По крайне мере - так сделано в системе.
__________________
Возможно сделать все. Вопрос времени
Старый 25.12.2008, 17:53   #9  
petergunn is offline
petergunn
Участник
 
118 / 274 (10) ++++++
Регистрация: 30.08.2005
Адрес: Tyumen
smmBusRelTable
Цитата:
Сообщение от mdconsult Посмотреть сообщение
Да, кстати, не указал, что меня интересует подобное разграничение на таблицу smmBusRelTable. Чтобы "Деловые отношения" модуля CRM менеджеры просматривали все, а редактировали только свои.
Если речь идет о форме smmBusRelTable то тогда понятно о каком поле "Ответственный" шла речь - smmBusRelTable.MainContact, код сотрудника из EmplTable? В таком случае необходимо модифицировать метод active() источника данных smmBusRelTable.

Можно предварительно сохранить в переменную код текущего сотрудника при открытии формы:
ClassDeclaration формы:
X++:
class FormRun extends ObjectRun
{
    ...
    EmplId  currentContactId ;
    ...
}
в методе init() формы:
X++:
void init()
{
    ...
    currentContactId = smmUtility::getCurrentContact() ;
    ...
}
Если речь идет о DAX 4.0 и предположения о том что пользователь может править "своих" (при условии что связь userId->EmplId определена) клиентов и тех у которых поле 'Ответственный' не задано (иметь возможность сделать ранее введенную запись 'своей') то примерно так:

X++:
#Admin
int active()
{
    boolean allowEdit ;

    ...
    allowEdit = UserInfoHelp::userInUserGroup( curUserId(), #AdminUserGroup ) || // администраторы могут править все?
                ( currentContactId && ( smmBusRelTable.MainContact == currentContactId
                                        // если возможность править записи с неуказанным ответственным не нужна - закоментировать строку ниже
                                        || !smmBusRelTable.MainContact                 
                ) ) ;
    smmBusRelTable_ds.allowEdit( allowEdit ) ;
    ...
}
В Axapta 3.0 по-моему при открытии формы требовалось что бы пользователь был связан с сотрудником (связь userId->EmplId будет гарантирована), поэтому часть условия (currentContactId) можно опустить:
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  
Ivanhoe is offline
Ivanhoe
Участник
Аватар для Ivanhoe
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
4,143 / 2156 (80) +++++++++
Регистрация: 29.09.2005
Адрес: Санкт-Петербург
Цитата:
Сообщение от sukhanchik Посмотреть сообщение
А во-вторых - обращаю внимание, что в буржуйском функционале (если не рассматривать локализацию) - на каждый модуль фиксированное кол-во ключей доступа - Ежедневные операции, запросы, отчеты, таблицы, настройки и разное.
В стандарте есть особый ключик в ветке Admin и совсем уж нестандартная ветка ключей Business Connector Proxy. Как раз для разграничения доступа. DAX 4.0 SP2.
__________________
Ivanhoe as is..
Старый 26.12.2008, 09:43   #11  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,323 / 3547 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Ivanhoe Посмотреть сообщение
В стандарте есть особый ключик в ветке Admin и совсем уж нестандартная ветка ключей Business Connector Proxy. Как раз для разграничения доступа. DAX 4.0 SP2.
Исключения как раз подтверждают правило.
Есть права доступа, относящиеся к ядру системы (exe-шнику). Это разработка, администрирование, Бизнес-коннектор. Из них разработка и бизнес-коннектор не имеют своего меню. Администрирование - имеет - но у него и похожая структура. За исключением открытия доступа к домену (что тоже является свойством ядра в большей степени). Конфигуратор продукции подчинен разработке - т.к. сам является генератором кода.
Все остальное имеет одинаковую структуру меню (исключая локализацию в т.ч. польские и чешские ключи).
Поэтому общее правило - ориентироваться на то, как это сделано в большинстве функционала (особенно в sys-слое).
__________________
Возможно сделать все. Вопрос времени
Старый 26.12.2008, 13:59   #12  
mdconsult is offline
mdconsult
Участник
Злыдни
1C
 
46 / 10 (1) +
Регистрация: 08.08.2008
Адрес: СПб
Thumbs up
Большое спасибо всем, кто откликнулся и помогал советами.
Отдельное спасибо petergunn.
Вставил проверку по пользователю и все заработало.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Настройка прав доступа к записям Andrew AG DAX: Функционал 10 26.04.2014 06:23
Расширение возможностей стандартных прав доступа Stainless DAX: Программирование 2 19.06.2008 10:36
при построении перекрёстных ссылок выдаётся сообщение об ошибках mmmax DAX: Программирование 10 21.01.2005 12:42
Разграничение прав доступа на складские операции mav DAX: Администрирование 27 15.10.2004 19:41
Проблемы настройки прав доступа пользователям axot DAX: Администрирование 25 16.05.2002 10:47
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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