Имя: Пароль:
1C
1С v8
8.2 Как обновить хэш только что записанного пароля?
0 Rounder
 
16.08.12
11:46
8.2.15.294
УФ
Делается процедура смены пароля.
Перед допуском к форме изменения пароля проверяется текущий пароль пользователя.
Насколько я понимаю сравнить можно только хэши паролей.
При записи проверочного пароля в базу хэш пароля пользователя не обновляется. Т.о. получаем всегда верный проверочный пароль.
Хэш пароля обновляется только с перезаходом пользователя в программу.
Есть ли методы обновить хэш без выхода пользователя из 1С?
1 Rounder
 
16.08.12
12:22
Актуально.
2 Lama12
 
16.08.12
12:30
Не понял вопрос.
Это свой механизм паролей или стандартный?
3 Rounder
 
16.08.12
12:40
(2) Свой. Конфа с нуля пишется.
Но и в УПП стандартного не нашел. Есть наводка?
4 ptiz
 
16.08.12
12:46
Юзер = ПользователиИнформационнойБазы.НайтиПоИмени(ПользователиИнформационнойБазы.ТекущийПользователь().Имя);
   Сообщить(Юзер.СохраняемоеЗначениеПароля);

Выдает новое значение.
5 Rounder
 
16.08.12
12:56
(4) Версия платформы какая?
6 Rounder
 
16.08.12
13:01
&НаСервере
Функция ПроверкаПароля()
   Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
   ХэшАвторизации = Пользователь.СохраняемоеЗначениеПароля;
   Пользователь.Пароль = ТекущийПароль; //Значение пароля для проверки с сущ.паролем
   Пользователь.Записать();
   ХэшПроверПароля = Пользователь.СохраняемоеЗначениеПароля;
   Если ХэшАвторизации = ХэшПроверПароля Тогда
       Возврат Истина;
   Иначе
       Пользователь.СохраняемоеЗначениеПароля = ХэшАвторизации;
       Пользователь.Записать();
       Возврат Ложь;
   КонецЕсли;
КонецФункции

Всегда возвращает истину
7 ptiz
 
16.08.12
13:09
(6) ох....
&НаСервере
Функция ПроверкаПароля()
   Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
   ХэшАвторизации = Пользователь.СохраняемоеЗначениеПароля;
   Пользователь.Пароль = ТекущийПароль; //Значение пароля для проверки с сущ.паролем

   Пользователь.Записать();
   ХэшПроверПароля = ПользователиИнформационнойБазы.НайтиПоИмени(Пользователь.Имя).СохраняемоеЗначениеПароля;
   Если ХэшАвторизации = ХэшПроверПароля Тогда
       Возврат Истина;
   Иначе
       Пользователь.СохраняемоеЗначениеПароля = ХэшАвторизации;
       Пользователь.Записать();
       Возврат Ложь;
   КонецЕсли;
КонецФункции
8 Rounder
 
16.08.12
13:11
(7) Что не так?
9 Rounder
 
16.08.12
13:13
Соррь
ХэшПроверПароля = Пользователь.СохраняемоеЗначениеПароля;

Та строка осталась от пробы иной реализации через временного пользователя.
10 ptiz
 
16.08.12
13:15
(9) Т.е. код из 7 не работает? Не верю.
11 Rounder
 
16.08.12
13:18
(10) Ну я тож не верил...
А не работает. Всегда возвращает ХэшАвторизации и ХэшПроверПароля одинаковыми.
Отладчик на каждой стадии программы тоже показывает хэш неизменным.

Какая у тебя версия платформы, где такой код (7) работает?
12 Rounder
 
16.08.12
13:20
Но если в (7) дойти до конца, т.е. вывалиться по Истине (т.о. пароль пользователя изменится), выйти из режима Предприятие и войти снова. То уже при авторизации примет только новый пароль и хэш отладчик покажет уже новый.
13 ptiz
 
16.08.12
13:27
Запусти этот код
   ТекЮзер = ПользователиИнформационнойБазы.ТекущийПользователь();
   СтароеСохраняемоеЗначениеПароля = ТекЮзер.СохраняемоеЗначениеПароля;
   ТекЮзер.Пароль = "123456789";
   ТекЮзер.Записать();
   
   НовоеСохраняемоеЗначениеПароля =  ПользователиИнформационнойБазы.НайтиПоИмени(ТекЮзер.Имя).СохраняемоеЗначениеПароля;
   Если СтароеСохраняемоеЗначениеПароля = НовоеСохраняемоеЗначениеПароля Тогда
       Сообщить("СОВПАДАЕТ. ОБЛОМ.");
   Иначе
       Сообщить("ВСЁ РАБОТАЕТ");
   КонецЕсли;
   ТекЮзер.СохраняемоеЗначениеПароля = СтароеСохраняемоеЗначениеПароля;
   ТекЮзер.Записать();
14 Rounder
 
16.08.12
13:37
(13) Работает
Отличия лишь в том, что новый пароль в коде задан явно, а в нашем случае берется из поля ввода формы. И вместо ХэшПроверПароля = Пользователь.СохраняемоеЗначениеПароля написано НовоеСохраняемоеЗначениеПароля =  ПользователиИнформационнойБазы.НайтиПоИмени(ТекЮзер.Имя).СохраняемоеЗначениеПароля.
Почему тогда одно работает, другое нет?
15 ptiz
 
16.08.12
13:41
Так всё и дело в ПользователиИнформационнойБазы.НайтиПоИмени()

ПользователиИнформационнойБазы.ТекущийПользователь() - видимо, закэширован

А ПользователиИнформационнойБазы.НайтиПоИмени() - получает новые данные из базы
16 Rounder
 
16.08.12
13:41
Т.е. получается что в нашем случае в строке ХэшПроверПароля = Пользователь.СохраняемоеЗначениеПароля; хэш брался из кэша, а в твоем мы обращаемся уже к базе для поиска юзера кэш обновляется либо уже берется не из него. Или есть другое объяснение?
17 Rounder
 
16.08.12
13:42
(15) В одно время написали. :)

Спасибо за помощь!
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.