Перемещение Spring Безопасность в конфигурацию Java, где выполняется проверка подлинности-success-handler-ref?

Наше приложение имеет специальный обработчик успеха для успешных логинов. Он в основном перенаправляет их на страницу, на которой они были, когда их сеанс истек.

Мы переходим к конфигурации Java, а не к конфигурации spring xml. Остальная часть конфигурации прошла очень плавно, но мы не можем найти, куда помещать атрибут аутентификации-success-handler-ref в тег безопасности: form-login.

<security:http auto-config='true'>
  ...
  <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
  <security:form-login login-page="/login" default-target-url="/sites"
                     authentication-failure-url="/login"
                     authentication-success-handler-ref="authenticationSuccessHandler"/>
 ...

Здесь наш конфиг.

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
       .authorizeRequests()
          .anyRequest().authenticated()
          .and()
        .formLogin()
          .loginPage("/login")
          .failureUrl("/login")
          .and()
        .logout()
          .permitAll()
          .and()
  }

Кроме того, мы не можем найти, куда поставить default-target-url, но это определенно менее важно.

Предостережение, мы на самом деле используем Groovy, но код в основном такой же, как и для конфигурации Java.

Ответы

Ответ 1

Все настройки могут быть выполнены внутри глобального метода настройки. Добавьте следующее:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
          .anyRequest().authenticated()
          .and()
        .formLogin()
          .loginPage("/login")
          .defaultSuccessUrl("/sites")
          .failureUrl("/login")
          .successHandler(yourSuccessHandlerBean) // autowired or defined below
          .and()
        .logout()
          .permitAll()
          .and()
  }

Ответ 2

Вам нужно создать bean расширение SimpleUrlAuthenticationSuccessHandler или SavedRequestAwareAuthenticationSuccessHandler. Например:

@Bean
public SavedRequestAwareAuthenticationSuccessHandler successHandler() {
    SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler();
    successHandler.setTargetUrlParameter("/secure/");
    return successHandler;
}

Затем вам нужно настроить его на bean, расширяя AbstractAuthenticationProcessingFilter:

UsernamePasswordAuthenticationFilter authenticationFilter = new UsernamePasswordAuthenticationFilter();
authenticationFilter.setAuthenticationSuccessHandler(successHandler());