Аутентификация в Spring Security с закодированным паролем

Используйте простое веб-приложение Spring Security с кодировкой пароля:

<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="personService">
     <security:password-encoder hash="md5" ref="passwordEncoder"> 
        <!--  <security:salt-source user-property="username"/> -->
     </security:password-encoder>
 </security:authentication-provider>
</security:authentication-manager>

Кодирование также простое:

 person.setPassword(encoder.encodePassword(person.getPassword(), null));

Таким образом, в базе данных все пароли будут закодированы. Теперь я хочу выполнить аутентификацию некоторого пользователя с определенным именем пользователя в приложении. Раньше (когда пароли были в виде открытого текста) было так:

UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
                username, password);
Authentication authentication = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authentication);

Но теперь я получаю закодированный пароль из БД и не могу выполнить аутентификацию, как раньше.

Проблема. что Spring не знает, что пароль исходит от уже закодированного UsernamePasswordAuthenticationToken. И он это кодирует второй раз. Кто может помочь?

Изменить

Итак, я вижу здесь два решения:

  1. реализовать настраиваемый DaoAuthenticationProvider, где добавить проверку, если оба пароля уже хешированы
  2. реализовать настраиваемую проверку подлинности и вручную поместить ее в контекст безопасности.

Есть другие? Что лучше?

6
задан vacuum 15 February 2012 в 23:01
поделиться