SpringBoot UsernamePasswordAuthenticationFilter problème

Je suis l'extension de UsernamePasswordAuthenticationFilter de sorte que je peux ajouter un champ personnalisé pour les enregistrer dans la session.

public class AuthFilter extends UsernamePasswordAuthenticationFilter {

@Override
public Authentication attemptAuthentication(HttpServletRequest request,
        HttpServletResponse response) throws AuthenticationException {
    //String dbValue = request.getParameter("dbParam");
    //request.getSession().setAttribute("dbValue", dbValue);
    System.out.println("attempting to authentificate");
    while (request.getAttributeNames().hasMoreElements()) {
        String e = (String) request.getAttributeNames().nextElement();
        System.out.println("param name : " + e + " and param value : " + request.getAttribute(e));
    }

    return super.attemptAuthentication(request, response);
    }
}

Et mon WebSecurityConfig

@Configuration
@EnableWebMvcSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;


@Bean
public AuthFilter customUsernamePasswordAuthenticationFilter()
        throws Exception {
    AuthFilter customUsernamePasswordAuthenticationFilter = new AuthFilter();
    customUsernamePasswordAuthenticationFilter
            .setAuthenticationManager(authenticationManagerBean());
   return customUsernamePasswordAuthenticationFilter;
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.addFilterAfter(customUsernamePasswordAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    http.exceptionHandling().accessDeniedPage("/403").and()
            .authorizeRequests().antMatchers("/login", "/public/**").permitAll()
            .antMatchers("/users/**").hasAuthority("ADMIN")
            .anyRequest()
            .authenticated().and().formLogin().loginPage("/login")
            .defaultSuccessUrl("/index").permitAll().and().logout()
            .permitAll();


    http.sessionManagement().maximumSessions(1)
            .expiredUrl("/login?expired").and()
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
            .invalidSessionUrl("/");
}

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws  Exception {
    auth.eraseCredentials(false)
    .userDetailsService(userDetailsService);
}

Cartographie de filtre: 'customUsernamePasswordAuthenticationfilter': [ /* ]

Donc je sais pour sûr que le filtre est correctement ajouté, mais je ne peux jamais d'impression de ce qui est à l'intérieur, il n'est donc pas appelée lors de l'authentification.

- Je utiliser Thymeleaf et pas de configuration xml.

@M. Deinum suggéré,
j'ai changé mon UsernamePasswordAuthenticationFilter, à AbstractAuthenticationProcessingFilter, appelé super(new AntPathRequestMatcher("/login","POST"));

Changé addFilterAfter à addFilterBefore, et un peu de code, et cela a fonctionné !

Et bien non, car l'authentification déjà eu lieu, donc il n'y a rien à faire de plus. Ajouter avant plutôt qu'après la UsernamePasswordAuthenticationFilter.
Il a essayé, même problème.
Vous pourriez aussi vouloir éviter l'enregistrer en tant que @Bean comme c'est également ajouté à la normale de la chaîne de filtre au lieu du printemps de la chaîne de sécurité. Printemps de Démarrage par défaut des registres de tous les Filter défini @Bean que les filtres, vous ne voulez ajouter au Printemps filtre de Sécurité de la chaîne.
Je me suis débarrassé de la Fève annotation, il est enregistré, mais toujours pas appelé lors de l'authentification car je ne vois pas mes tirages.
Eh bien en fait non, il ne le fait pas, il obtient la version qui est géré par le Printemps de Démarrage. Donc, cela dépend de Printemps version de Démarrage. En supposant que vous utilisez la dernière version de Printemps de Démarrage (1.2.3), vous êtes probablement à l'aide de Spring Security 3.2.7 cette version des cartes de la UsernamePasswordAuthenticationFilter à /j_spring_security_check cependant lors de l'utilisation de java config c'est changé à /login pour celui par défaut. Cependant, le vôtre est encore mappé à l'ancienne URL. Créer un constructeur par défaut qui appelle super(new AntPathRequestMatcher("/login","POST"));.

OriginalL'auteur Zouazou | 2015-05-17