1С: проверка пароля пользователя
Задача: проверить соответствие имени пользователю, введённый им пароль. Пользователи хранятся в стандартном справочнике «Пользователи»
Решение: в 1С нет штатных методов проверки пароля, т.к. пароль как таковой не хранится, а хранится его хэш. Следовательно для того чтобы проверить введенный пароль, необходимо сравнить «старый» хэш с хэшэм введеного пароля. Но есть нюанс — никто не знает по какому алгоритму генерируется хэш при сохранении пароля. Следовательно подходит лишь один алгоритм:
- Получаем хэш текущего пароля
- Начинаем транзакцию
- Сохраняем введеный пароль пароль у пользователя
- Получаем хэш введенного пароля
- Отменяем транзакцию (тем самым отменяем изменения у пользователя)
- Сравниваем первый хэш со вторым. Если равны — значит пароль соответствует.
Воплощение:
// Функция по входящим body.login и body.password выдает или error=true
// или возращает полное имя, уникальный идентификатор и список доступных для проведения инвентаризации документов
Функция Auth(body)
answer = Новый Структура("error, result",false,"");
ПользовательИнформационнойБазы = ПользователиИнформационнойБазы.НайтиПоИмени(body.login);
Если ПользовательИнформационнойБазы = Неопределено Тогда
answer.error=true;
answer.result="Пользователь не найден в БД";
возврат answer;
Иначе
ХэшНастоящегоПароля = ПользовательИнформационнойБазы.СохраняемоеЗначениеПароля;
НачатьТранзакцию();
ПользовательИнформационнойБазы.Пароль = body.password;
ПользовательИнформационнойБазы.Записать();
ХешВведенногоПароля = ПользователиИнформационнойБазы.НайтиПоИмени(body.login).СохраняемоеЗначениеПароля;
ОтменитьТранзакцию();
Если ХешВведенногоПароля = ХэшНастоящегоПароля Тогда
answer.error=false;
answer.result=Новый Структура("UserName,UserId,MyInvent",ПользовательИнформационнойБазы.ПолноеИмя,ПользовательИнформационнойБазы.УникальныйИдентификатор,Новый Массив());
Иначе
answer.error=true;
answer.result="Не верный пароль пользователя";
возврат answer;
КонецЕсли;
конецесли;
возврат answer;
КонецФункции
