1С: проверка пароля пользователя
Задача: проверить соответствие имени пользователю, введённый им пароль. Пользователи хранятся в стандартном справочнике «Пользователи»
Решение: в 1С нет штатных методов проверки пароля, т.к. пароль как таковой не хранится, а хранится его хэш. Следовательно для того чтобы проверить введенный пароль, необходимо сравнить «старый» хэш с хэшэм введеного пароля. Но есть нюанс — никто не знает по какому алгоритму генерируется хэш при сохранении пароля. Следовательно подходит лишь один алгоритм:
- Получаем хэш текущего пароля
- Начинаем транзакцию
- Сохраняем введеный пароль пароль у пользователя
- Получаем хэш введенного пароля
- Отменяем транзакцию (тем самым отменяем изменения у пользователя)
- Сравниваем первый хэш со вторым. Если равны — значит пароль соответствует.
Воплощение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// Функция по входящим 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; КонецФункции |