Spring - пользовательский поставщик аутентификации Вызова от контроллера

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

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

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

6
задан David Buckley 1 July 2010 в 17:36
поделиться

2 ответа

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

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

1
ответ дан 17 December 2019 в 07:00
поделиться

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

You также следует по возможности избегать аутентификации напрямую с помощью вашего настраиваемого провайдера аутентификации. Ваша конфигурация 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);

Мы также, необязательно, сохраняем результат аутентификации на этом этапе в cookie «запомни меня» с использованием метода onLoginSuccess () из TokenBasedRememberMeServices .

3
ответ дан 17 December 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: