Добавление обработчика успеха в AuthenticationProvider в приложении Spring

#java #spring

#java #spring

Вопрос:

Как я могу добавить обработчик успеха в AuthenticationProvider в приложении Spring?

Я сделал следующее WebSecurityConfigurerAdapter из руководств baeldung:

 @Configuration
@EnableWebSecurity
public class LoginConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private GatewayAuthenticationProvider authProvider;
    @Autowired
    private GatewayAuthenticationSuccessHandler successHandler;
    @Autowired
    private GatewayLogoutSuccessHandler logoutSuccessHandler;

    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authProvider);
    }

    @Override
    protected void configure(final HttpSecurity http) throws Exception {

        http.csrf().disable();
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/welcome*").permitAll()
            .antMatchers("/login*").permitAll()
            .anyRequest().authenticated();
        http.authenticationProvider(authProvider);
        http.formLogin()
            .loginProcessingUrl("/perform_login")
            .defaultSuccessUrl("/dashboard")
            .successHandler(successHandler);
        http.logout()
            .logoutUrl("/perform_logout")
            .deleteCookies("JSESSIONID")
            .logoutSuccessHandler(logoutSuccessHandler);

    }

}
  

Как вы можете видеть, .successHandler(successHandler) метод применяется после .formLogin() , поэтому, похоже, он настраивает форму входа, а не пользовательский вход из AuthenticationProvider .

Но .authenticationProvider(authProvider) возвращает HttpSecurity объект, у которого нет .successHandler(successHandler) метода.

Заключается ли хитрость в самом AuthenticationProvider определении класса?

Комментарии:

1. Вы этого не делаете. Различные механизмы аутентификации вызывают обработчик успеха или сбоя, а не authenticationproviders. Таким образом, фильтр входа в форму вызовет обработчик успеха, а не предоставленного поставщика / менеджера аутентификации.

2. Да, но я хотел бы, чтобы мой AuthenticationProvider вызывался при входе в систему вместо formlogin, а затем мой successHandler в случае успешного входа в систему. Могу ли я это сделать?

3. форма входа не является поставщиком аутентификации. Поставщик аутентификации — это такая же вещь, как DB, LDAP и т.д.

4. Да, но тогда есть ли способ добавить действие после того, как поставщик аутентификации подтвердит, что учетные данные действительны? Или единственный способ добавить его непосредственно в код AuthenticationProvider?