Explication sur loadUserByUsername et UserDetailsService
Bonjour,
Je suis entrain de customiser l'autentification et il y a des choses que ne comprend pas trop car cela à l'aire d'être automatique et
a cause de cela j'ai tourner en rond car je n'ai pas réussi à faire appelle à cette " loadUserByUsername".
Voici le début du fichier de mon spring sécurity:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
System.out.println("configure Security Config .java");
auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
System.out.println("==> csrf dispabled");
http.csrf().disable();// genere erreur 403
System.out.println("==> http.sessionManager");
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.authorizeRequests().anyRequest().authenticated();
System.out.println("==> addFilter");
http.addFilter(new JWTAuthentificationFilter(authenticationManager()));
} |
Voici la classe de l'authentification:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
public class JWTAuthentificationFilter extends UsernamePasswordAuthenticationFilter{
private AuthenticationManager authenticationManager;
public JWTAuthentificationFilter(AuthenticationManager authenticationManager){
super();
this.authenticationManager = authenticationManager;
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException{
BookodMembre membre = null;
try {
System.out.println("333==> JWT Auhentification");
membre = new ObjectMapper().readValue(request.getInputStream(),Membre.class); |
Quand on tente de se connecté pour la première fois on doit récupérer le jwt en donnant le login et mot de passe dans la requête "request".
une fois le try , automatiquement on fait appelle à la méthode "loadUserByUsername" de la class N'importeQuoi
voici cette class :
Code:
1 2 3 4 5 6 7 8 9 10
|
@Service
public class NimporteQuoi implements UserDetailsService{
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
System.out.println("class NimporteQuoi");
return new User("toto","$2y$10$6Qu5XbUS9OekX5.huNhn/eaWWPm3NRG6Ghho0lxNLQSMBqzsjWvgu",new ArrayList<>());
}
} |
Quand je recherche dans mon IDE "NimporteQuoi", je le trouve seulement 1 résultat c'est mon propre fichier NimporteQuoi.java.
De même quand je recherche "loadUserByUsername".
De plus après avoir appelé "loadUserByUsername",
spring sécurité fait appelle à protected void successfulAuthentication(
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
throws AuthenticationException{
BookodMembre membre = null;
try {
System.out.println("333==> JWT Auhentification");
membre = new ObjectMapper().readValue(request.getInputStream(), BookodMembre.class);
} catch (Exception e) {
System.out.println("!!!!!!!!!!!!!ERREUR !!!!!!!!!:");
throw new RuntimeException(e);
}
return authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(membre.getUsername(), membre.getpassword())
);
}
@Override
protected void successfulAuthentication(
HttpServletRequest request, HttpServletResponse response,
FilterChain chain, Authentication authResult) throws IOException, ServletException{
User springUser = (User)authResult.getPrincipal();
System.out.println("============ authentifaction reussi ======"+springUser); |
Quelle est la class ou la méthode qui permet à spring boot d'appeler cette méthode dans un classe que j'ai volontairement appelé "NimporteQuoi".
Si quelqu'un à une explication car pour le moment c'est automatique et quand cela fonctionne cela n'est pas dérangeant mais dès qu'il y a un problème on tourne on rond car on a pas bien compris pourquoi cette méthode n'est pas appelé.
Null par j'ai instancié la classe NimporteQuoi ou fait un bean, mais j'ai quand même le résultat des mes test sur la console:
Code:
1 2 3 4
|
333==> JWT Auhentification
class NimporteQuoi
============ authentifaction reussi ======org.springframework.security.core.userdetails.User@64d1707: |
De même pour la méthode "successfulAuthentication", quelle est la classe qui fait appelle à cette méthode ?
merci d'avance de vos réponses :)