Printemps de Démarrage Fournisseur d'Authentification Personnalisé avec Java Configuration ne fonctionne pas

J'essaye de configurer un REPOS en fonction de l'application web, où l'interface est à l'aide de Reactjs et le backend est à l'aide de Printemps de Démarrage. Je suis aussi en train d'essayer de configurer un fournisseur d'authentification personnalisé, et c'est là que mes problèmes de démarrage. Lorsque vous essayez de tester la connexion de l'appel API, le CustomAuthenticationProvider n'est jamais appelée, et au lieu de la valeur par défaut DaoAuthenticationProvider est utilisé. Cela provoque la connexion au rapport "Bad credentials".

J'ai télécharger une petite application exemple pour github: spring-boot-auth-démo

Pour tester la connexion API-je utiliser le curl suivante:

curl -H "Content-Type: application/json" -X POST -d '{"username":"admin","password":"admin"}' http://localhost:8080/api/users/login

La CustomAuthenticationProvider un simple nom d'utilisateur/mot de passe de vérifier et renvoie un UsernamePasswordAuthenicationToken objet.

package no.bluebit.demo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
private static final Logger logger =     LoggerFactory.getLogger(CustomAuthenticationProvider.class);
public CustomAuthenticationProvider() {
logger.info("*** CustomAuthenticationProvider created");
}
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if(authentication.getName().equals("admin")  && authentication.getCredentials().equals("admin")) {
List<GrantedAuthority> grantedAuths = new ArrayList<>();
grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials(), grantedAuths);
} else {
return null;
}
}
@Override
public boolean supports(Class<?> authentication) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}
}

La CustomAuthenticationProvider est câblé à l'aide de la SecurityConfiguration classe. Lorsque vous exécutez le code, je peux voir que la CustomAuthenicationProvider n'est pas dans la liste des fournisseurs utilisé pour authentifier la demande entrante.

package no.bluebit.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAuthenticationProvider customAuthenticationProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.authenticationProvider(this.customAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/users/login").permitAll()    //Permit access for all to login REST service
.antMatchers("/").permitAll()                   //Neccessary to permit access to default document
.anyRequest().authenticated().and()                 //All other requests require authentication
.httpBasic().and()
.logout().and()
.csrf().disable();
}
}

Pourquoi ça ne marche pas?

  • Jetez un oeil à ceci: stackoverflow.com/questions/22453550/...
  • Merci!!!! Le manque @Autocâblés annotation a été la question. Problème résolu!
  • peut-être ajouter votre commentaire en réponse, de sorte que Håvard Bakke peut accepter comme une réponse?
  • Je viens d'essayer, mais le système convertit des réponses simples à des commentaires...
  • il suffit de mentionner, pourquoi "@autocâblés' a été nécessaire et le suivi avec l'URL alors vous pouvez l'ajouter comme une réponse 🙂
  • Double de stackoverflow.com/questions/22453550/...