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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.06.2005, 17:20   #1  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Слетают права при импорте проекта
Коллеги!

Никто не сталкивался со следующей ситуацией: при импорте проекта (новый функционал или даже просто измененный существующий) слетают настроенные права доступа. Ключи прописаны. Ситуация возникает, даже если в новом проекте не создавались ключи!

Кто-нибудь сталкивался? Как решали проблему?

С Уважением,
Георгий
Старый 23.03.2006, 17:32   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
синие - актуальные настройки права на элементы формы
красные - утерянные настройки
Старый 23.03.2006, 20:50   #3  
glibs is offline
glibs
Member
Сотрудники компании It Box
Most Valuable Professional
Лучший по профессии 2011
Лучший по профессии 2009
 
4,942 / 911 (40) +++++++
Регистрация: 10.06.2002
Адрес: I am from Kyiv, Ukraine. Now I am in Moscow. For private contacts: glibs@hotmail.com
А я думал, оно сразу и чинит...

Хотя, и за это спасибо.
__________________
С уважением,
glibs®
Старый 24.03.2006, 13:17   #4  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
версия 2 - продвинутая
Добавлена возможность автоматического исправления ошибок и удаления мусора.
Как любое автоматическое исправления, имеет свои "особенности". Если будете использовать, то сначала потестируйте внимательно.
PHP код:
static void CheckAccess(Args _args)
{
    
SysSecurityFormControlTable     SysSecurityFormControlTable;
    
SysSecurityFormTable            SysSecurityFormTable;
    
FormRun                         fr;
    
FormBuildDesign                 fbd;
    
Args                            args = new Args();
    
Map                             name2id;
    
Map                             name2label;
    
Dialog                          d = new Dialog('Проверка прав на формах');
    
DialogField                     dfShow;
    
DialogField                     dfUpdate;
    
DialogField                     dfClear;

    
str 30 getLabel(Object _control)
    {
        switch (
classIdGet(_control))
        {
            case 
classnum(FormBuildStringControl):
            case 
classnum(FormBuildCheckBoxControl):
            case 
classnum(FormBuildGroupControl):
            case 
classNum(FormBuildRealControl):
            case 
classNum(FormBuildIntControl):
            case 
classNum(FormBuildComboBoxControl):
            case 
classNum(FormBuildWindowControl):
            case 
classNum(FormBuildDateControl):
            case 
classNum(FormBuildListBoxControl):
            case 
classNum(FormBuildTimeControl):
                return 
_control.label();
            case 
classNum(FormBuildRadioControl):
            case 
classNum(FormBuildTabPageControl):
                return 
_control.caption();
            case 
classNum(FormBuildButtonControl):
            case 
classNum(FormBuildCommandButtonControl):
            case 
classNum(FormBuildMenuButtonControl):
            case 
classNum(FormBuildFunctionButtonControl):
                return 
_control.text();
            default :
                return 
_control.name();
        }
        return 
_control.name();
    }

    
void fillMap(Object _containerControl)
    {
        
int     i;
        
Object  fbc;

        for( 
1<= _containerControl.controlCount(); ++)
        {
            
fbc _containerControl.controlNum(i);
            if(
fbc.isContainer())
                
fillMap(fbc);
            else
            {
                
name2id.insert(fbc.name(), fbc.id());
                
name2label.insert(fbc.name(), getLabel(fbc));
            }
        }
    }

    
dfShow   d.addFieldValue(typeId(NoYesId), true'Отображать сведения в инфолог',
                                                      
'info - корректные права, warning - известен новый id объекта, error - непонятно что');
    
dfUpdate d.addField(typeId(NoYesId), 'Исправлять ID, если найден правильный',
                                           
'Попытка восстановить права на "измененные" объекты формы');
    
dfClear  d.addField(typeId(NoYesId), 'Удалять ссылки на неверный ID (и неисправленные)',
                                           
'Если не стоит "Исправлять..", то удалятся все некорректные настройки');

    if(! 
d.run() || (dfShow.value()   != NoYes::Yes &&
                     
dfUpdate.value() != NoYes::Yes &&
                     
dfClear.value()  != NoYes::Yes)  )
        return;

    
SetPrefix('Проверка прав на контролы');
    
startLengthyOperation();

    while 
select SysSecurityFormTable
        order by DomainId
FormNameUserGroupId
    
{
        
args.name(SysSecurityFormTable.FormName);
        
fr ClassFactory::formRunClassOnClient(args);
        
fbd fr.form().design();

        
name2id = new Map(Types::StringTypes::Integer);
        
name2label = new Map(Types::StringTypes::String);
        
fillMap(fbd);

        
SetPrefix(strFmt("%2 (%1)\t %3"fr.name(), fbd.caption(), SysSecurityFormTable.UserGroupId));

        try
        {
            
ttsbegin;
            
SysSecurityFormControlTable.selectForUpdate(dfClear.value() || dfUpdate.value());

            while 
select SysSecurityFormControlTable
                order by FormControlId DESC
FormControlName
                where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
            
{
                if(
name2id.exists(SysSecurityFormControlTable.FormControlName) &&
                   
name2id.lookup(SysSecurityFormControlTable.FormControlName) == SysSecurityFormControlTable.FormControlId)
                {
                    if(
dfShow.value() == NoYes::Yes)
                        
info(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                }
                else
                {
                    if(
name2label.exists(SysSecurityFormControlTable.FormControlName))
                    {
                        if(
dfShow.value() == NoYes::Yes)
                            
warning(strFmt("%1 (%2) - %3"name2label.lookup(SysSecurityFormControlTable.FormControlName),
                                                     
SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));
                        if(
dfUpdate.value() == NoYes::Yes)
                        {
                            
SysSecurityFormControlTable.FormControlId name2id.lookup(SysSecurityFormControlTable.FormControlName);
                            
SysSecurityFormControlTable.update();
                        }
                        else if(
dfClear.value() == NoYes::Yes)
                            
SysSecurityFormControlTable.delete();
                    }
                    else
                    {
                        if(
dfShow.value() == NoYes::Yes)
                            
error(strFmt("%1 - %2"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.AccessType));

                        if(
dfClear.value() == NoYes::Yes)
                            
SysSecurityFormControlTable.delete();
                    }
                }
            }

            
ttscommit;
        }
        catch
        {
            
error("Исправление не удалось!");
            
// Если исправление для некоторых форм-групп не удалось, то можно
            // исправить сортировку order by FormControlId на ASC и запустить еще раз
        
}
    }

    
ttsbegin;

    
SetPrefix('Права на контролы без привязок к формам');
    while 
select forupdate SysSecurityFormControlTable
    notexists join SysSecurityFormTable
        where SysSecurityFormTable
.RecId == SysSecurityFormControlTable.SysSecurityFormId
    
{
        if(
dfShow.value() == NoYes::Yes)
            
error(strFmt("%1 (%2) %3"SysSecurityFormControlTable.FormControlNameSysSecurityFormControlTable.FormControlIdSysSecurityFormControlTable.FormControlType));
        if(
dfClear.value() == NoYes::Yes)
            
SysSecurityFormControlTable.delete();
    }

    
SetPrefix('Ссылка на формы без настроек на контролы');
    while 
select forupdate SysSecurityFormTable
    notexists join SysSecurityFormControlTable
        where SysSecurityFormControlTable
.SysSecurityFormId == SysSecurityFormTable.RecId
    
{
        if(
dfShow.value() == NoYes::Yes)
            
error(strFmt("%1 (%2) %3"SysSecurityFormTable.FormNameSysSecurityFormTable.DomainIdSysSecurityFormTable.UserGroupId));
        if(
dfClear.value() == NoYes::Yes)
            
SysSecurityFormTable.delete();
    }

    
ttscommit;
    
endLengthyOperation();

За это сообщение автора поблагодарили: glibs (4), George Nordic (5), Qaz Qwerty (1).
Старый 06.11.2008, 18:25   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,925 / 3205 (114) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Wamr спасибо вам за предоставленную информацию.

От себя еще добавлю, что настройка прав доступа на уровне контролов на форме (когда используются таблицы
SysSecurityFormTable, SysSecurityFormControlTable)
может глючить самым смешным образом.

Реальный пример.

1. Используются домены.
2. Ключ доступа к доменам включен (возможно это не влияет на воспроизводимость глюка, привожу просто для справки)
3. Есть 2 компании 100 и 200. Им соответсвуют домены Домен100 и Домен200
4. Пользователь является членом групп Admin и Группа1
5. Для группы Группа1, формы Справочник1 и домена Домен200 в табличках SysSecurityFormTable, SysSecurityFormControlTable заведены настройки, скрывающие определенные.
6. Справочник1 отображает данные из виртуальной компании - так что все равно откуда его открывать.

Теперь прикол.
Если пользователь первый раз открывает форму справочник1 в компании 100 (т.е. Домен100) - то все нормально - кнопки ему доступны.
Если же он первый раз открывает форму справочник1 в компании 200 (т.е. Домен200) - то кнопки ему уже недоступны ! Если при этом переключиться в компанию 100 и открыть справочник там, то кнопки станут доступны. И будут доступны, если обратно перключиться в компанию 200 и открыть в 3-й раз форму справочник1. Такое ощущение что один раз догрузив правильные настройки - система их уже не меняет.

Все это очень странно. Выглядит как шаманство. Самое паршивое, что глюк действует на Админа !
Теперь понимаю почему техподдержка в ответ на просьбы настроить права нервно скрежещет зубами и тихо матерится.

P.S.

Ax 3.0 KR3 SP5

1-й джоб wamr-a натравил - проблем не выявлено. Красных сообщений не было. Только выведена информация о том какие кнопки скрыты.

Последний раз редактировалось Logger; 06.11.2008 в 18:29.
Старый 07.11.2008, 11:52   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,925 / 3205 (114) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Для админа можно отключить применение настроек так :
\Classes\SysSetupFormRun\init
X++:
public void init()
{
    #admin
    ;
    super();
    // pkoz 07.11.2008 -->
    // для админа отменяем настройки прав доступа на форме
    if (!UserInfoHelp::userInUserGroup(curUserID(), #AdminUserGroup)) 
    // pkoz 07.11.2008 <--
    SysSecurityFormSetup::loadSecurity(this);
}
За это сообщение автора поблагодарили: gl00mie (3).
Теги
ax3.0, id объекта, xpo, законченный пример, импорт, права доступа

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Бага при импорте проекта Logger DAX: Программирование 0 09.12.2008 13:57
Сколько процентов от стоимости проекта идет на ФОТ? (анонимный опрос) Spider DAX: Прочие вопросы 1 27.09.2006 08:22
Проблемы при импорте и экспорте проекта FiGr DAX: Прочие вопросы 0 23.05.2006 16:41
Удаление проекта Maxim Gorbunov DAX: Программирование 0 24.12.2001 23:04

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:53.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.