Периодическая смена паролей пользователей базы 1С












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

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

В доменных политиках Windows  есть такая удобная штука, как принудительная периодическая смена пароля учетной записи пользователя. Давно хотелось сделать что-то подобное и для 1С-ки.

Реализация выполнена на конфигурации «Альфа-Авто» от «Рарус», но в принципе, с минимальными доработками, портируема и на другие конфигурации.

Всего необходимо внести четыре изменения:

 

Изменение первое: в раздел «Константы» добавляются две константы (см. пример 1):

1.ПериодическаяСменаПароля — булева типа, по этой константе будет включаться, отключаться периодическая смена пароля.

2. ПериодичностьСменыПароля — Число(3,0) — здесь указывается период в днях, через который потребуется смена пароля.

Эти константы необходимо добавить в экранную форму редактирования констант (см. пример 2). Для удобства администрирования я повесил на событие «ПериодичностьСменыПароляПриИзменении» простую процедуру:

 

Процедура ПериодическаяСменаПароляПриИзменении(Элемент)
   Если ПериодическаяСменаПароля Тогда
ТекстВопроса = "Установить ";
ЗначениеДляПодстановки = истина;
Иначе
ТекстВопроса = "Снять ";
ЗначениеДляПодстановки = ложь;
КонецЕсли;
 ТекстВопроса = ТекстВопроса+"у всех пользователей признак ""Периодическая смена пароля""?";  
 Если   Вопрос( ТекстВопроса,РежимДиалогаВопрос.ДаНет) = КодВозвратаДиалога.Да  Тогда
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ | Пользователи.Ссылка КАК Ссылка |ИЗ | Справочник.Пользователи КАК Пользователи";
РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Размер = РезультатЗапроса.Количество();
Для каждого элПользователь Из РезультатЗапроса Цикл
обПользователь = элПользователь.Ссылка.ПолучитьОбъект();
обПользователь.ПериодическаяСменаПароля  = ЗначениеДляПодстановки;
обПользователь.Записать();
Состояние(Строка(РезультатЗапроса.Индекс(элПользователь))+"/"+Размер);
КонецЦикла;
КонецЕсли;
КонецПроцедуры

 

Данная процедура при изменении значения константы «ПериодическаяСменаПароля» предлагает , и при согласии пользователя, изменяет аналогичный реквизит для всех элементов справочника «Пользователи».

 

Второе изменение, которое необходимо внести, это дополнительные реквизиты справочника «Пользователи»(см. примеры 3,4):

1. Реквизит «ПериодическаяСменаПароля» — булева типа

2. Реквизит «ДатаПоследнейСменыПароля» — типа «Дата», состав «Дата»

 Реквизит «ПериодическаяСменаПароля» в справочнике «Пользователи» необходим для того, чтобы можно было отключать смену пароля у части пользователей. Как пример, служебные учетные записи, используемые для автоматического запуска обработок («Robot», «BackUp» и т.д.).

Третье изменение: в какой-либо из существующих или вновь созданный глобальный модуль добавляются  несколько процедур:

Процедура раПроверитьСрокПароля(Пользователь) Экспорт
Если раПарольПросрочен(Пользователь) Тогда
раСменитьПароль(Пользователь);
КонецЕсли;
КонецПроцедуры
Функция раПарольПросрочен(ТекПользователь) Экспорт Если Константы.ПериодическаяСменаПароля.Получить()  Тогда
Если ТекПользователь.ПериодическаяСменаПароля Тогда
ПериодичностьСменыПароля = Константы.ПериодичностьСменыПароля.Получить() * 24 * 60 * 60;
// из количества дней приводим к 1С-кому формату временной разницы     
    ДатаСменыПароля = НачалоДня(ТекПользователь.ДатаПоследнейСменыПароля + ПериодичностьСменыПароля);
Если ДатаСменыПароля <= НачалоДня(ТекущаяДата()) Тогда
Возврат истина;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат ложь;

КонецФункции // ПарольПросрочен(ТекПользователь) 
Процедура раСменитьПароль(спрПользователь)Экспорт
#Если Клиент Тогда   
  ТекПользователь = ПользователиИнформационнойБазы.НайтиПоИмени(ИмяПользователя());
ОбъектПользователь = спрПользователь.ПолучитьОбъект();
ТекстПредупреждения = " В соответствии с политикой информационной безопасности организации"+Символы.ПС+
"пароль пользователя должен изменяться каждые "+Константы.ПериодичностьСменыПароля.Получить()+ " дней."+Символы.ПС+
"---------------------------------------------------------------------------------------------------------------------------------------------"+ Символы.ПС +
"Пароль пользователя должен удовлетворять следующим требованиям сложности:"+ Символы.ПС +
"---------------------------------------------------------------------------------------------------------------------------------------------"+ Символы.ПС +
"Длина не менее "+ПолучитьМинимальнуюДлинуПаролейПользователей()+" символов."+Символы.ПС+
"Содержит не менее 3-х типов символов из перечисленных ниже:"+Символы.ПС+
" заглавные буквы"+Символы.ПС+
" строчные буквы"+Символы.ПС+
" цифры"+Символы.ПС+
" спец.символы"+Символы.ПС+
"Не совпадает с именем пользователя."+Символы.ПС+
"Не является последовательностью символов.";
Предупреждение(ТекстПредупреждения,60);
ВведенТекущийПароль = ложь;
Пока НЕ ВведенТекущийПароль Цикл
ТекущийПароль = "";
Подсказка = "Введите текущий пароль";
Если Не ВвестиПароль(ТекущийПароль, Подсказка) Тогда
ЗавершитьРаботуСистемы(ложь);
Возврат;
КонецЕсли;
Если ПарольДействует(ТекущийПароль) Тогда
ВведенТекущийПароль = истина;
КонецЕсли;
КонецЦикла;
ПарольЗаменен = ложь;
Пока НЕ ПарольЗаменен Цикл
ТекстПароля1 = "";
Подсказка = "Смена пароля. Введите новый пароль";
Если Не ВвестиПароль(ТекстПароля1, Подсказка) Тогда
ЗавершитьРаботуСистемы(ложь);
Возврат;
КонецЕсли;

ТекстПароля2 = "";
Подсказка = "Повторите новый пароль";
Если Не ВвестиПароль(ТекстПароля2, Подсказка) Тогда
ЗавершитьРаботуСистемы(ложь);
Возврат;
КонецЕсли;
Если ТекстПароля1<>ТекстПароля2 Тогда
Предупреждение("Введенные пароли не совпадают!",10);
ИначеЕсли ТекущийПароль = ТекстПароля1 Тогда
Предупреждение("Новый пароль не должен совпадать со старым!",10);
Иначе
ТекПользователь.Пароль=ТекстПароля1;
Попытка
ТекПользователь.Записать();
ОбъектПользователь.ДатаПоследнейСменыПароля = ТекущаяДата();
ОбъектПользователь.Записать();
ПарольЗаменен = истина;
Исключение
ТекстОшибки = ОписаниеОшибки();
Место = Найти(ТекстОшибки,"Записать):");
Длина = СтрДлина(ТекстОшибки);
ТекстОшибки = Прав(ТекстОшибки,Длина - Место-10);
Если ТекстОшибки = "Заданный пароль короче установленной минимальной длины" Тогда
ТекстОшибки = ТекстОшибки +": "+ ПолучитьМинимальнуюДлинуПаролейПользователей()+" символов.";
КонецЕсли;
Если ТекстОшибки = "Заданный пароль не удовлетворяет требованиям сложности" Тогда
ТекстОшибки = ТекстОшибки +": "+ Символы.ПС +
+"-----------------------------------------------"+ Символы.ПС +
"Длина не менее "+ПолучитьМинимальнуюДлинуПаролейПользователей()+" символов."+Символы.ПС+
"Содержит не менее 3-х типов символов из перечисленных ниже:"+Символы.ПС+
" заглавные буквы"+Символы.ПС+
" строчные буквы"+Символы.ПС+
" цифры"+Символы.ПС+
" спец.символы"+Символы.ПС+
"Не совпадает с именем пользователя."+Символы.ПС+
"Не является последовательностью символов.";
КонецЕсли;
Предупреждение(ТекстОшибки,60);
// здесь штатными средствами платформы выдается сообщение, чем пароль не устраивает     
    КонецПопытки;
КонецЕсли;
КонецЦикла;
ПериодичностьСменыПароля = Константы.ПериодичностьСменыПароля.Получить() * 24 * 60 * 60;
ДатаСледующейСмены =  спрПользователь.ДатаПоследнейСменыПароля + ПериодичностьСменыПароля;
ТекстПредупреждения =  "Пароль пользователя изменен."+Символы.ПС+
"Благодарим за понимание."+Символы.ПС+
"Следующая смена пароля: "+Формат(ДатаСледующейСмены,"ДЛФ=DD");
Предупреждение(ТекстПредупреждения,10);
#КонецЕсли 
КонецПроцедуры
Функция ПарольДействует(ТекущийПароль)
СтрокаСоединения =  СтрокаСоединенияИнформационнойБазы()+" ";
Логин = "Usr="""+ИмяПользователя()+"""; ";
Пароль = "Pwd="+ТекущийПароль;
СтрокаСоединения = СтрокаСоединения + Логин + Пароль;
cntr = Новый COMObject("V82.COMConnector");
Попытка
connection = cntr.Connect(СтрокаСоединения);
ПарольДействует = истина;
Исключение
ОписаниеОшибки = ОписаниеОшибки();
Если Найти(ОписаниеОшибки,"Неправильное имя или пароль пользователя")>0 Тогда
ПарольДействует = ложь;
Иначе
ПарольДействует = истина;
КонецЕсли;
КонецПопытки;
connection = "";
cntr = "";
Возврат ПарольДействует;
КонецФункции

Функция ВвестиПароль(ТекстПароля, Подсказка)
НоваяФорма = ПолучитьОбщуюФорму("ВводПароля",,"Моя форма");
НоваяФорма.Заголовок = Подсказка;
ПароляТекст = НоваяФорма.ОткрытьМодально();
Если ПароляТекст <> Неопределено Тогда
ТекстПароля = ПароляТекст;
Возврат истина;
Иначе
Возврат ложь;
КонецЕсли;
КонецФункции

 И, наконец, четвертое изменение:

В процедуру «ПриНачалеРаботы» модуля приложения добавляется вызов процедуры «раПроверитьСрокПароля(ПараметрыСеанса.Пользователь)».

 

После внесения изменений в конфигурацию, при первом заходе в базу данных необходимо будет установить значение константы «ПериодическаяСменаПароля» в «истина». После этого будет выведено диалоговое окно, предлагающее изменить значение реквизита «ПериодическаяСменаПароля» для всех элементов справочника «Пользователи», что и будет сделано при положительном ответе. Далее, необходимо будет выставить значение константы «Периодичность смены пароля», например — 60. Это значит, что система будет запрашивать смену пароля каждые 60 дней.

Далее, если есть пользователи, у которых не должен периодически меняться пароль, необходимо снять у данных элементов справочника «Пользователи» соответствующую галочку реквизита «Периодическая смена пароля».

Собственно, и вся настройка.

Теперь, при первом последующем заходе пользователя в базу данных у него выйдет диалоговое окно, оповещающее о необходимости смены пароля (см. пример 5).

После этого пользователю будет предложено ввести старый пароль.

Тут позволю себе небольшое отступление:

Понятно, что вновь устанавливаемый пароль пользователя не должен совпадать со старым. Иначе, вся идея смены пароля сливается в никуда. Старый пароль пользователя необходим нам, чтобы сравнить его с новым. К сожалению, пароль пользователя хранится в базе в хэшированном виде и я не нашел способов выдернуть его в пригодном для сравнения с новым паролем виде. Поэтому, мы вынуждены требовать от пользователя ввести старый пароль в открытом виде и проверять, действительно ли введен актуальный пароль от базы.

Для этого мы создаем объект «V82.COMConnector», прописываем в его параметрах путь к базе, имя пользователя и введенный им пароль. После этого пробуем соединиться с базой данных . Если соединение прошло успешно — пароль верный. Если была возвращена ошибка «Неправильное имя или пароль пользователя», то значит, пользователь пытается нас обмануть. Еще возможна ошибка «Данному пользователю не разрешены внешние соединения», но она возникает уже после успешной авторизации. Нас и такой вариант устроит. Пароль ведь верный, а это все, что нам сейчас надо знать.

Далее пользователю предлагается ввести и подтвердить новый пароль (см . пример 6).

Если пароль не удовлетворяет требованиям по сложности, то пользователю будет выведено об этом сообщение (см. пример 7) и будет предложено ввести новый пароль еще раз.

Еще одно отступление:

Параметры сложности паролей пользователей настраиваются в режиме «Конфигуратор», в меню «Администрирование» — «Параметры информационной базы» (см. пример 8). Здесь можно выставить минимально допустимую длину пароля, а проверку сложности пароля пользователя. Пароль в таком случае будет проверяться по наличию как минимум, трех различных групп символов:  цифры, большие и маленькие буквы, а также различные раскладки клавиатуры.

Если пользователь не захочет вводить старый или новый пароли, то работы системы будет завершена.

Итак, пользователь успешно ввел новый пароль, отвечающий требованиям безопасности.  Теперь, в течение прописанного в константе «ПериодичностьСменыПароля» (например, 60 дней) система оставит пользователя в покое. А по истечении этого срока, вновь потребует сменить пароль.

К сожалению, ничего не мешает пользователю поменять пароль на новый, а затем в пользовательском режиме зайти в «Сервис» — «Параметры пользователя» и там поменять пароль опять на старый. Но для этого необходимо, чтобы пользователь знал об этой возможности, а о ней, как показывает практика знают очень мало пользователей. Для того, чтобы отсечь эту возможность, пришлось бы хранить пароли пользователей в базе в открытом виде, а это, по моему мнению, излишний в данном случае, риск.

И в заключение, несколько моментов организационного порядка:

  1. Безопасность информации в базе данных должна обеспечиваться комплексом мер, и периодическая смена паролей пользователей,  это только одна из них. Описание других мер обеспечения безопасности информации выходит за рамки данной статьи.
  2. Периодическую смену паролей пользователей в 1С логичнее всего вводить параллельно с введением периодической смены паролей пользователей доменных учетных записей. При этом желательно, выставить одинаковые требования по длине и сложности паролей . Периоды смены паролей лучше тоже выставить одинаковые, но разнести периодичность на пару дней (например, пароли на доменные учетные записи изменялись в понедельник, а на учетные записи 1С – в среду). Это позволит сделать смену паролей менее болезненной для пользователей.
  3. Введение данного новшества неминуемо столкнется  с пассивным, а может, и активным, противодействием пользователей. Наиболее действенным средством, основываясь на практике, служит приказ по организации примерно следующего содержания:  «Ответственность за действия, совершенные под  учетной записью пользователя, в том числе, и другими лицами, несет сам пользователь. Пользователю запрещается передавать пароли от своих учетных записей другим лицам. Пользователь, отходя от своего рабочего места, обязан заблокировать сессию, во избежание доступа других лиц к ней.  Пароли на учетные записи пользователей должны изменяться с периодичностью в 60 дней. За простой, вызванный утерянным паролем от учетной записи, несет ответственность  сам пользователь ».  С данным приказом следует ознакомить всех пользователей под роспись. Этим сразу снимается колоссальная доля психологической инерции и негатива пользователей.
  4. В любой, наверно, организации есть пользователи, любящие забывать пароли.  После введения данного новшества частота забывания ими пароля гарантировано вырастет в разы. Эффективным средством дисциплинирования таких пользователей служит фиксация фактов внеплановой смены пароля. Причем, вероятнее всего, даже не придется выкладывать данную статистику на стол руководителя. Зачастую пользователю хватает того факта, что тот факт, что он опять забыл пароль, фиксируется, например в «Тетради фиксации внеплановой смены пароля». Чаще всего, пользователь немедленно вспоминает свой пароль.  

P.S. Дополнительно хотелось бы прикрутить проверку на несовпадение паролей пользователя Windows  и пользователя базы 1С. К сожалению, мне не удалось найти способа сравнения данных паролей.

 

42 Comments

  1. sergson1

    Очень необходимая вещь, для тех кто работает в больших организациях и не доверяет своим коллегам))

    Reply
  2. veforg

    Лучше использовать доменную авторизацию чем выдумывать свой велосипед.

    Reply
  3. Altair777

    (0) «P.S. Дополнительно хотелось бы прикрутить проверку на несовпадение паролей пользователя Windows и пользователя базы 1С. К сожалению, мне не удалось найти способа сравнения данных паролей.»

    И, кажется, не найдешь. 🙂

    1С хранит не сами пароли, а их хеш. Насчет Винды не уверен, но если и нее и 1С одинаковый алгоритм шифрования, то можно сравнивать хеши. Кстати, смену паролей я тоже делал, но немножко другими методами.

    Reply
  4. dka80

    (2) доменная авторизация хороша там, где один компьютер — один пользователь. А если взять торговый зал магазина? А если мне надо зайти под другим пользователем 1С из текущего сеанса ОС?

    Reply
  5. alon

    (4)А для этого придумали switch user, run as different user, log off наконец. Все уж лучше, чем заставлять продавцов помнить по 5 паролей.

    Reply
  6. YuliaYVS

    Вещь хорошая, а если ещё поставить ограничения на количество повторов ввода пароля ))), потом и сам не зайдешь.

    Reply
  7. AAndryA

    Дали недавно анологичную задачу ! Щас смотреть буду может подойдет и велосипед изобретать не придется !

    Reply
  8. AAndryA

    В процедуру «ПриНачалеРаботы» модуля приложения добавляется вызов процедуры «раПроверитьСрокПароля(ПараметрыСеанса.Пользователь)». Я что то саму процедуру не вижу ! 🙁

    Reply
  9. ms200999

    (2) Например, работаем через веб-клиент с нетбука на пляже. Какая доменная авторизация?

    Опять же, случаются внешние пользователи, не имеющие учетной записи в домене.

    Reply
  10. babylon_5

    (8) похоже имеется в виду функция ‘раПарольПросрочен’

    Reply
  11. Kaperang

    (8)AAndryA, прошу прощения — мой недосмотр. Процедура выглядит так:

    Процедура раПроверитьСрокПароля(Пользователь) Экспорт
    Если раПарольПросрочен(Пользователь) Тогда
    раСменитьПароль(Пользователь);
    КонецЕсли;
    КонецПроцедуры
    
    Reply
  12. babylon_5

    Продолжаем…

    /*********************

    1) Ошибка при вызове метода контекста (ПолучитьОбщуюФорму)

    НоваяФорма = ПолучитьОбщуюФорму(«ВводПароля»,,»Моя форма»);

    2) Ошибка при установке значения атрибута контекста (ПериодическаяСменаПароля)

    обПользователь.ПериодическаяСменаПароля = ЗначениеДляПодстановки;

    по причине:

    Реквизит недоступен для группы

    Reply
  13. Kaperang

    (12) babylon_5,

    1) упс….да, совсем забыл … нужно добавить еще общую форму под названием «ВводПароля»

    с одним реквизитом формы «Пароль» строкового типа с установленным свойством «Режим пароля»и процедурой:

    Процедура ПриЗакрытии
    
    Возврат Пароль;
    
    КонецПроцедуры

    завтра поправлю статью

    2)тут вариантов решения ошибки два:

    или установите для реквизита «ПериодическаяСменаПароля» справочника «Пользователи» свойство «Использование» в «Для группы и элемента».

    или можно изменить соответствующий кусок кода с:

    обПользователь = элПользователь.Ссылка.ПолучитьОбъект();
    обПользователь.ПериодическаяСменаПароля  = ЗначениеДляПодстановки;
    обПользователь.Записать();

    на

    Если НЕ элПользователь.ЭтоГруппа Тогда
    обПользователь = элПользователь.Ссылка.ПолучитьОбъект();
    обПользователь.ПериодическаяСменаПароля  = ЗначениеДляПодстановки;
    обПользователь.Записать();
    КонецЕсли;
    Reply
  14. babylon_5

    (13)

    тут вариантов решения ошибки два:

    Хм, я пошел третьим путем. Группы отсеял еще в запросе.

    Запрос.Текст = «ВЫБРАТЬ
    | Пользователи.Ссылка КАК Ссылка
    |ИЗ
    | Справочник.Пользователи КАК Пользователи
    |ГДЕ
    | Пользователи.ЭтоГруппа = ЛОЖЬ»
    

    P.S. А почему публикация не активна?

    Reply
  15. babylon_5

    (13) И вот вместо этого:

    Процедура ПриЗакрытии
    
    Возврат Пароль;
    
    КонецПроцедуры

    может таки что-то вроде:

    Процедура ОсновныеДействияФормыОк(Кнопка)
    Закрыть(Пароль);
    КонецПроцедуры
    

    А то как-то не гармонирует. Процедура,.. Возврат…

    Reply
  16. babylon_5

    Еще может родиться проблема с «V82.ComConnector» если база запускается не под последней установленной на компьютере версией платформы. Например стоит что-то из 8.2.14, а базу запускаем под 8.2.13. Вот тут-то и родится… прикол с созданием объекта…

    Reply
  17. Abadonna

    (5)

    А для этого придумали switch user, run as different user, log off наконец. Все уж лучше, чем заставлять продавцов помнить по 5 паролей.

    А кто мешает при авторизации 1С ввести тот же доменный пароль? И не помнить по 5?

    Reply
  18. Abadonna

    (0)

    Ответственность за действия, совершенные под учетной записью пользователя, в том числе, и другими лицами, несет сам пользователь

    Мне всегда было интересно: неужели найдется такой человек, который добровольно полезет в 1С под чужой учетно записью и будет там что-то делать?

    А если он убежденный, целенаправленный вредитель, то, будь уверен, он найдет способ попасть в базу хоть по пять раз на дню пароль меняй!

    ИМХО, опять «паранойя безопасности». И проггеры при деле :)))

    Reply
  19. Kaperang

    (15)Согласен. Писал по памяти на скорую руку. Сегодня выложу оригинальный рабочий код из базы.

    Reply
  20. Kaperang

    (18) Abadonna, реальный пример: у нас автоцентр. Есть станция СТО, где работают мастера-приемщики. И есть отдел запасных частей, где работают продавцы. Премию за проданную деталь получает тот, кто поставил ее в резерв под клиента. Соответственно, если есть право на корректировку резервов, возникает изкушение сбросить старый резерв, и зарезервировать деталь снова на того же клиента, но уже от своего имени. Ни у мастеров-приемщиков, ни у продавцов прав на снятие резервов нет. Но если как-бы вдруг, у кого-то из них оказался пароль от учетной записи пользователя, имеющего право на корректировку резервов….У нас такие ситуации были. Наказали обоих — и «злодея», и того, кто дал пароль от своей учетки.

    Reply
  21. Kaperang

    (17) Abadonna, ну как бы, если у всех учетных записей пользователя одинаковые пароли, это не есть гуд. Это азы информационной безопасности. А вообще, приходится, как правило, делать компромисс между требованиями безопасности и удобством работы пользователей.

    Reply
  22. Kaperang

    (16) babylon_5, хорошее замечание. Надо будет воспроизвести на тестовой базе. Хотя для того, чтобы база запустилась в таком режиме, надо это прописать это в ее настройках (В окне списка баз — «Настройки баз» — «Используемые версии»). А это весьма редко используемая, на мой вгляд, настройка.

    У нас был несколько иной вариант: изначально база была на 8.1, соответственно в коде стояло «V81.ComConnector».

    При переходе на 8.2 этот кусок кода забыли поправить.

    В итоге полмесяца система воспринимала любой введенный пользователем «от балды» пароль, как старый пароль системы.

    Отрабатывала конструкция «Попытка-Исключение-КонецПопытки». Но база с ошибкой не вываливалась.

    Reply
  23. Kaperang

    (17) Abadonna, правильно, пока ничего не мешает. Поэтому и ищу способ сравнения паролей доменной учетной записи и учетной записи 1С.

    Reply
  24. Kaperang

    Вообще, уровень мер по информационной безопасности должен находится в прямой зависимости от размера организации, количества конкурентов в регионе и ценности информации в базе.

    Ваш прокси-сервер никогда не пытались брут-форсить? И сотрудникам вашей организации никогда не предлагали продать клиентскую базу? Тогда естественно Вам непонятно то, что Вы называете «паранойей безопасности».

    Меры информационной безопасности нужны, но впадать в фанатизм конечно не стоит. Повторюсь, нужный разумный компромисс между удобством работы пользователей и данными мерами.

    Reply
  25. Lyuba-Lyuba

    Считаю, очень полезно.

    Reply
  26. _ink_

    Нужная вещь. Хотя на мой взгляд всё должно быть комплексно. Единственное что напрягает то это постоянно держать в голове кучу паролей. И, боюсь, что через несколько смен у большинства пользователей пароли будут уровня «123qwe» или всё будет писаться в ежедневник… Хотя это уже другая история и проблемы службы безопасности.

    Reply
  27. Oleg1708

    Вот тут тоже ошибка записи пароля будет, для Альфы.

    ТекПользователь.Пароль=ТекстПароля1;

    Попытка

    ТекПользователь.Записать();

    ОбъектПользователь.ДатаПоследнейСменыПароля = ТекущаяДата();

    ОбъектПользователь.Записать();

    ПарольЗаменен = истина;

    Исключение

    ОбъектПользователь — записывает пароль. И если его не установить то запишет старый. В альфе такой «прикол».

    Reply
  28. Kaperang

    (27) Oleg1708, а первая строка приведенного Вами куска кода что делает?

    ТекПользователь.Пароль=ТекстПароля1;

    Она как раз и устанавливает новый пароль.

    Доработка работает на базе с конфигурацией «Рарус:Альфа-Авто» с >50 пользователями уже больше года.

    Единственная трабла возникла при переходе на 8.2. Пришлось переписать в коде «V81.COMConnector» на «V82.COMConnector»

    Reply
  29. Oleg1708

    (28)

    да да.

    устанавливает. а эта:

    ОбъектПользователь.Записать();

    перезаписывает.

    перезаписывает этого же пользователя со старым паролем. Но это в альфе такое, если у пользователя

    админ.функции установлены.

    в проц. призаписи есть такое:

    Если ПользовательИБ <> Неопределено И ПравоДоступа(«Администрирование», Метаданные) Тогда

    Попытка

    ПользовательИБ.Записать();

    Исключение

    Сообщить(ОписаниеОшибки());

    Отказ = Истина;

    Возврат;

    КонецПопытки;

    КонецЕсли;

    Reply
  30. Evgen2011

    Что-то не нашел процедуры на проверку сложносит пароля, хотя она вроде в описании указана

    Reply
  31. Kaperang

    (30) Evgen2011, сложность и длина пароля настраивается средствами самой платформы. Конкретно: Конфигуратор — Администрирование — Параметры информационной базы. Там можно включить проверку сложности пароля и минимальную его длину. При установке нового пароля (неважно,интерактивно или программно), если он не удолетворяет заданным условиям, то платформа вызывает исключение. Проще говоря, вываливается сообщение об ошибке. У меня это обрабатывается конструкцией:

    ТекПользователь.Пароль=ТекстПароля1;
    Попытка
    ТекПользователь.Записать();
    ОбъектПользователь.ДатаПоследнейСменыПароля = ТекущаяДата();
    ОбъектПользователь.Записать();
    ПарольЗаменен = истина;
    Исключение
    ТекстОшибки = ОписаниеОшибки();
    Место = Найти(ТекстОшибки,»Записать):»);
    Длина = СтрДлина(ТекстОшибки);
    ТекстОшибки = Прав(ТекстОшибки,Длина — Место-10);
    Если ТекстОшибки = «Заданный пароль короче установленной минимальной длины» Тогда
    ТекстОшибки = ТекстОшибки +»: «+ ПолучитьМинимальнуюДлинуПаролейПользователей()+» символов.»;
    КонецЕсли;
    Если ТекстОшибки = «Заданный пароль не удовлетворяет требованиям сложности» Тогда
    

    Показать

    Reply
  32. ak0710

    Как раз требовалось такая фича, немного посмотрев комментарии удалось успешно установить данную наработку

    Reply
  33. Jetoo

    может кто-нибудь подсказать по поводу:

    В файловом варианте все работает, а в серверном после ввода нового пароля выдает:

    «После изменения в списке пользователей не осталось бы никого с административными правами»

    посмотрел в справке Роли:

    Тип: РолиПользователя. Содержит коллекцию ролей пользователя информационной базы.

    Примечание:

    Доступно только пользователю с административными правами.

    И действительно, если у пользователя админские права — все проходит без ошибок. А без них похоже просто не видит ролей.

    Но почему в файловом все работает и без админских?? Как сделать в серверном?

    Reply
  34. son_v

    Надо темку запомнить. Очень полезная. Спасибо.

    Reply
  35. suxo

    Подскажите, в программировании очень туго. Это можно применить к УТ 8,2 ? или надо много переписывать.

    Если сделать все по плану то на УТ тоже заработает? Просто делать по плану буду долго, а если окажется в конце что это не работает на УТ 10,3 то будет грустно 🙂

    Reply
  36. tiniji

    Может кто-нибудь нашел как закрыть смену пароля через Сервис — Параметры пользователя ?

    Reply
  37. Synoecium

    (37) tiniji, А что если поставить галку «Запрет на изменение пароля»? В форме редактирования пользователя есть код, который отвечает за доступность пароля, теоретически его можно подредактировать и дать возможность менять несмотря на значение этой галки.

    Reply
  38. user600441_sonic400

    может я что-то не правильно понял но я пытаюсь запустить ее из модуля упраляемого прложения в процедуре ПриНачалеРаботыСистемы()

    раПроверитьСрокПароля(Пользователь);

    КонецПроцедуры;

    просто не видит ее может сможете подсказать в чем косяк?

    Reply
  39. Kaperang

    (39) user600441_sonic400, обработка писалась 5 лет назад под обычные формы. Без «допиллинга» на управляемых формах точно не взлетит. Могу навскидку предположить:. 1. У общего модуля, в котором размещена процедура раПроверитьСрокПароля не включено свойство «Сервер». 2. Перед процедурой есть директива прекомпилятору «Если Клиент»

    Reply
  40. Kaperang

    (39) user600441_sonic400, в 8.2 не так давно появились методы работы с md5-хешем. В частности, получение хэша текущего пароля. Их использование, думаю может помочь в сравнении старого и нового паролей. В таком случае можно будет избежать «костыля» с использованием v8.connector. На выходных попробую переделать механизм под новые технологии.

    Reply
  41. Kaperang

    (39) user600441_sonic400, посмотрите еще вот эту обработку:тыц. Автор взял за основу мою обработку и «допилил» её под управляемые формы.

    Reply
  42. AnnaKalacheva

    Спасибо, очень помогло!

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *