Вы на самом деле не сказали, что идет не так, но код аутентификации должен быть точно таким же, как и для нехэшированной версии.
Если у вас есть хешированный пароль в базе данных и введен соответствующий кодировщикв провайдере аутентификации пароль, предоставленный пользователем, будет хеширован кодером перед сравнением его с версией базы данных.
Убедитесь, что:
- Вы используете значение нехэшированного пароля, когдасоздание
UsernamePasswordAuthenticationToken
- Значение в базе данных действительно совпадает с хешем, созданным кодировщиком.Загрузите его сами и проверьте в тесте.База данных может хранить его в верхнем регистре, например.
Кроме того, вам, вероятно, следует выбрать что-то лучше, чем обычный MD5.Возможно, вы захотите взглянуть на bcrypt, например, который поддерживается в Spring Security 3.1 и автоматически использует случайное солт-значение.
Обновление
Ваше предложение о создании провайдера, который принимает хешированные пароли, не является хорошим.Это позволило бы любому, кто украл хеш пароля, напрямую аутентифицироваться с ним (таким образом, в первую очередь победив цель хеширования).
Просто проверьте URL-адреса электронной почты, загрузите информацию для этого пользователя и создайте Authentication
объект для них:
UserDetails user = ... // load user here
Authentication a = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(a);