Spring - вызов custom-authentication-provider из контроллера

У меня есть настраиваемый поставщик проверки подлинности, определенный в моей конфигурации Spring Security. Этот класс реализует AuthenticationProvider, и я могу успешно войти в систему, используя форму, определенную на моей странице. Проблема в том, что я хочу вызвать этот класс не только на странице входа в систему, но и со страницы регистрации.

Страница регистрации использует другой класс команд и собирает больше информации, чем форма входа в систему. Прямо сейчас, когда пользователь регистрируется, я вызываю соответствующий контроллер, добавляю запись в базу данных, и они могут затем войти в систему, но они не входят в систему автоматически. Поскольку они только что дали мне свое имя пользователя / пароль на странице регистрации, могу ли я передать это в настраиваемый класс AuthenticationProvider, чтобы они также вошли в систему?

Я попытался создать класс org.springframework.security.Authentication в контроллере регистрации и вызвать метод аутентификации в классе AuthenticationProvider моего клиента, и это не вызывает ошибки, но пользователь не вошел в систему. Должен ли я вызвать метод выше в цепочке фильтров Spring Security для этого? Следует ли перенаправить контроллер на URL-адрес j_spring_security_check? Если да, то как мне передать имя пользователя / пароль?


person David Buckley    schedule 01.07.2010    source источник


Ответы (2)


Вам нужно поместить результат AuthenticationProvider.authenticate() в SecurityContext (полученный из SecurityContextHolder).

Также имейте в виду AuthenticationSuccessEvent - если ваше приложение полагается на это событие (некоторые функции Spring Security также могут его использовать), вы должны опубликовать его (вы можете получить AuthenticationEventPublisher по умолчанию через автоматическое подключение). Может быть полезно заключить поставщика аутентификации в ProviderManager, он автоматически публикует событие с использованием данного издателя.

person axtavt    schedule 01.07.2010

Проблема, с которой вы столкнулись, заключается в том, что, хотя вы успешно аутентифицировали пользователя, вы не сохранили результат этой аутентификации в SecurityContext пользователя. В веб-приложении это объект ThreadLocal, который SecurityContextPersistenceFilter будет использовать для хранить учетные данные пользователя в HTTPSession

Вам также следует по возможности избегать аутентификации напрямую с помощью вашего настраиваемого провайдера аутентификации. Ваша конфигурация xml должна содержать AuthenticationManager, к которому подключен ваш пользовательский провайдер аутентификации. Например,

<bean id="customAuthenticationProvider" 
  class="com.foo.CustomAuthenticationProvider">
  <property name="accountService" ref="accountService"/>
</bean>
<security:authentication-manager alias="authenticationManager">
  <security:authentication-provider ref="customAuthenticationProvider"/>
</security:authentication-manager>

Если вы подключите authenticationManager к своей службе регистрации и аутентифицируетесь с ее помощью, он дополнительно:

Наша служба регистрации делает это следующим образом

final UsernamePasswordAuthenticationToken authRequest = new 
  UsernamePasswordAuthenticationToken(username, password);

final Authentication authentication = 
  authenticationManager.authenticate(authRequest);
SecurityContextHolder.getContext().setAuthentication(authentication);

Мы также при желании можем сохранить результат аутентификации на этом этапе в файле запомнить меня, используя _ 9_ метода _ 10_.

person Caoilte    schedule 04.07.2010