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é !
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
Vous devez vous connecter pour publier un commentaire.
En supposant que vous utilisez la dernière version de Printemps de Démarrage (1.2.3) vous êtes à 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 à base de configuration, il est modifié pour/login
.Le vôtre est encore mappé à l'ancienne URL. Pour corriger cette étendre
AbstractAuthenticationProcessingFilter
ajouter une valeur par défaut aucun des arguments du constructeur qui appelle la super constructeur qui prend unRequestMatcher
. Inconvénient de ceci est que si vous avez encore besoin (ou envie de prolonger) la fonctionnalité de laUsernamePasswordAuthenticationFilter
vous devez dupliquer.Une autre solution consiste à prolonger la
UsernamePasswordAuthenticationFilter
et appelsetRequiresAuthenticationRequestMatcher
à partir de là.Ou vous appelez la méthode à partir de votre méthode de fabrique.
Il y a également un autre problème avec votre configuration, votre filtre ne sera jamais exécuté, car il est exécuté après le défaut
UsernamePasswordAuthenticationFilter
et d'authentification déjà arrivé que votre filtre ne sera jamais exécuter. Assurez-vous qu'il s'exécute avant le filtre par défaut.Rendu compte que plus tard. Le problème, c'est que votre filtre à maintenant, n'a pas la fonctionnalité de login que c'était spécifique à la
UsernamePasswordAuthenticationFilter
. J'ai modifié la réponse à inclure les 2 autres solutions possibles...OriginalL'auteur M. Deinum