Во-первых, я повторяю комментарии "вам почти наверняка не нужно использовать authenticate_user()
". Плагин может справиться со всем этим за вас.
Однако «это не хеширует» неправильно; вот как это работает. Ключевое слово authenticate_user
перебирает все настроенные области аутентификации и для каждой из них запрашивает метод authenticate_user()
этого провайдера, чтобы узнать, принимает ли он имя пользователя и пароль. Поставщик Database
(и другие) извлекает запись из БД и использует $self->match_password()
(который поступает из роль поставщика), чтобы проверить ее; этот код проверяет, начинается ли сохраненный пароль из базы данных с {scheme}
, и если да, использует Crypt::SaltedHash->validate
для проверки того, что введенный пользователем пароль (в виде обычного текста, так как он только что пришел по сети) соответствует сохраненному хешированному паролю ($correct
в приведенный ниже код является сохраненным паролем):
if ( $correct =~ /^{.+}/ ) {
# Looks like a crypted password starting with the scheme, so try to
# validate it with Crypt::SaltedHash:
return Crypt::SaltedHash->validate( $correct, $given );
}
Итак, да, если ваш сохраненный пароль в базе данных хеширован, то он будет соответствовать ему, если указанный пароль соответствует этому хешу.
Для примера того, как должен выглядеть сохраненный хешированный пароль, вот вывод прилагаемой утилиты generate-crypted-password
:
[davidp@supernova:~]$ generate-crypted-password
Enter plain-text password ?> hunter2
Result: {SSHA}z9llSLkkAXENw8FerEchzRxABeuJ6OPs
Подробнее о том, какие алгоритмы он поддерживает, см. в документе Crypt::SaltedHash. формат, который он использует (который «происходит из RFC-3112 и расширяется за счет использования различных цифровых алгоритмов»).
Имейте в виду, что код, стоящий за authenticate_user
, — это именно то, что используется для вас под капотом.
В качестве примера, позволяющего плагину делать всю работу за вас, рассмотрим:
get '/secret' => require_login sub {
my $user = logged_in_user();
return "Hi, $user->{username}, let me tell you a secret";
};
... это оно. require_login
означает, что плагин проверит, вошел ли пользователь в систему, и если нет, перенаправит его на страницу входа для входа. Вам не нужно вызывать authenticate_user
самостоятельно, вам не нужно устанавливать какие-либо переменные сеанса или что-либо. logged_in_user()
вернет хэш-ссылку информации о вошедшем в систему пользователе (а поскольку в коде маршрута есть require_login
, в этот момент он гарантированно будет, поэтому вам не нужно проверять).
Если вам нужно проверить, что у них есть подходящая роль, а не только то, что они вошли в систему, посмотрите вместо этого require_role
в документации.
person
David Precious
schedule
12.10.2017
authenticate_user
позаботится о хешировании и сравнении под капотом. Как он это делает, совершенно прозрачно. Он поставляется с кучей разных провайдеров, но вы также можете свернуть свой собственный, если вам нужно что-то еще. - person simbabque   schedule 30.08.2017