#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?