Erreur Spring Boot PasswordEncoder

J’apprends à utiliser Spring Boot en faisant un petit projet. Actuellement, j’ai la classe principale:

package com.recweb.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication /*@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})*/ public class SpringbootApplication { public static void main(Ssortingng[] args) { SpringApplication.run(SpringbootApplication.class, args); } } 

une classe de membres (id, prénom ..), une classe MemberController:

 package com.recweb.springboot; import java.util.Arrays; import java.util.List; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class MemberController { @GetMapping("/members") public List getAllUsers(){ return Arrays.asList(new Member(1, "amit")); } } 

et une classe WebSecurityConfig:

 package com.recweb.springboot; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public UserDetailsService userDetailsService() { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withUsername("user").password("user").roles("USER").build()); return manager; } } 

Lorsque j’exécute ” http: // localhost: 8080 / members “, je reçois une page de connexion, je saisis “utilisateur” comme utilisateur et “utilisateur” comme mot de passe, puis je reçois le membre codé en dur. Cela a bien fonctionné, mais j’ai ensuite cliqué avec le bouton droit de la souris sur mon installation Run as-Maven (parce que j’ai ajouté une dépendance, je ne sais pas si c’était nécessaire, la première fois avec Maven). Depuis lors, lorsque je saisis “utilisateur” et “utilisateur” sur la page de connexion, j’obtiens cette erreur:

 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" at org.springframework.security.crypto.password.DelegatingPasswordEncoder$UnmappedIdPasswordEncoder.matches(DelegatingPasswordEncoder.java:233) ~[spring-security-core-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.crypto.password.DelegatingPasswordEncoder.matches(DelegatingPasswordEncoder.java:196) ~[spring-security-core-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.authentication.dao.DaoAuthenticationProvider.additionalAuthenticationChecks(DaoAuthenticationProvider.java:86) ~[spring-security-core-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:166) ~[spring-security-core-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:174) ~[spring-security-core-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:199) ~[spring-security-core-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:124) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) ~[spring-security-web-5.0.0.BUILD-SNAPSHOT.jar:5.0.0.BUILD-SNAPSHOT] at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:108) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.1.RELEASE.jar:5.0.1.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.23.jar:8.5.23] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.23.jar:8.5.23] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_131] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.23.jar:8.5.23] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_131] 

et il rest sur la page de connexion. J’ai essayé de supprimer la dépendance et Maven installer à nouveau, mais pas de chance. Ceci est mon POM:

   4.0.0 com.recweb springboot 0.0.1-SNAPSHOT jar springboot Demo project for Spring Boot  org.springframework.boot spring-boot-starter-parent 2.0.0.BUILD-SNAPSHOT     UTF-8 UTF-8 1.8    org.springframework.boot spring-boot-starter-data-jpa   org.springframework.boot spring-boot-starter-data-rest   org.springframework.boot spring-boot-starter-jdbc   org.springframework.boot spring-boot-starter-security   org.springframework.boot spring-boot-starter-web   com.h2database h2 runtime   org.springframework.boot spring-boot-starter-test test   org.springframework.security spring-security-test test    org.hibernate hibernate-validator 5.3.0.Final   org.springframework.boot spring-boot-starter-tomcat <!-- provided -->      org.springframework.boot spring-boot-maven-plugin      spring-snapshots Spring Snapshots https://repo.spring.io/snapshot  true    spring-milestones Spring Milestones https://repo.spring.io/milestone  false      spring-snapshots Spring Snapshots https://repo.spring.io/snapshot  true    spring-milestones Spring Milestones https://repo.spring.io/milestone  false     

Qu’est ce qui ne s’est pas bien passé? Merci

Dans spring-security-core:5.0.0.RC1 , le PasswordEncoder par défaut est construit en tant que DelegatingPasswordEncoder . Lorsque vous stockez les utilisateurs en mémoire, vous fournissez les mots de passe en texte brut et lorsque vous tentez de récupérer l’encodeur depuis DelegatingPasswordEncoder pour valider le mot de passe, il ne peut pas en trouver un correspondant à la manière dont ces mots de passe ont été stockés.

Utilisez cette méthode pour créer des utilisateurs à la place.

 User.withDefaultPasswordEncoder().username("user").password("user").roles("USER").build(); 

Vous pouvez aussi simplement préfixer {noop} sur vos mots de passe pour que DelegatingPasswordEncoder utilise NoOpPasswordEncoder pour valider ces mots de passe. Notez que NoOpPasswordEncoder est obsolète, car il n’est pas NoOpPasswordEncoder de stocker les mots de passe en texte brut.

 User.withUsername("user").password("{noop}user").roles("USER").build(); 

Pour plus d’informations, consultez ce post.

https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-encoding

Veuillez utiliser NoOpPasswordEncoder pour inMemoryAuthentication

 auth .inMemoryAuthentication() .withUser("user").password("{noop}password").roles("USER") 
 @Override public void configure(AuthenticationManagerBuilder auth) throws Exception{ auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()) .withUser("test").password("test123").roles("USER").and() .withUser("test1").password("test123").roles("ADMIN"); } 

Vous devez avoir un encodeur de mot de passe, mais

 withDefaultPasswordEncoder() 

est déconseillé et n’est plus adapté à la production. Utilisez ceci à la place:

 PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); ... UserDetails user = User.withUsername("someusername") .password(encoder.encode("somepassword")) .roles("USER").build(); 

Réf: https://docs.spring.io/spring-security/site/docs/5.0.2.BUILD-SNAPSHOT/api/index.html?org/springframework/security/core/userdetails/User.html

J’ai simplement ajouté

  @Bean public static NoOpPasswordEncoder passwordEncoder() { return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance(); } 

À la classe de configuration

Vous pouvez l’utiliser, mais soyez averti que User.withDefaultPasswordEncoder() est obsolète :

 @Bean @Override public UserDetailsService userDetailsService() { PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder(); final User.UserBuilder userBuilder = User.builder().passwordEncoder(encoder::encode); UserDetails user = userBuilder .username("user") .password("password") .roles("USER") .build(); UserDetails admin = userBuilder .username("admin") .password("password") .roles("USER","ADMIN") .build(); return new InMemoryUserDetailsManager(user, admin); } 

Préfixez tous les mots de passe existants avec {noop} pour conserver l’encodeur par défaut de Spring Security 5.

Exemple:

 auth.inMemoryAuthentication() .withUser("admin").password("{noop}admin!234").roles("ADMIN"); 

Selon la nouvelle fonctionnalité de spring security 5.0. Ils écrivent ceci .

L’interface PasswordEncoder de Spring Security est utilisée pour effectuer une transformation à sens unique d’un mot de passe pour permettre le stockage sécurisé du mot de passe. Étant donné que PasswordEncoder est une transformation à sens unique, il n’est pas prévu que la transformation de mot de passe doive être bidirectionnelle (c’est-à-dire stocker les informations d’identification utilisées pour s’authentifier dans une firebase database). Typiquement, PasswordEncoder est utilisé pour stocker un mot de passe devant être comparé à un mot de passe fourni par l’utilisateur au moment de l’authentification.

J’ai donc essayé ce Mutiple HttpSecurity . C’est ma configuration de sécurité. J’espère que cela vous aidera.

 @Configuration @EnableWebSecurity public class SecurityConfig { private final EdminService edminService; public SecurityConfig ( final EdminService edminService ){ this.edminService=edminService; } @Bean public UserDetailsService userDetailsService() throw Exception { UserBuilder users= Users.withDefaultPasswordEncoder; InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); List edminList=this.edminService.findAll(); for(EdminEntity edmin: edminList){ manager.createUser(users.username(edmin.getEdminname()) .password(edmin.getEdminrpass()).roles("EDMIN_ROLE").build()); } return manager; } @Configuration @Order(1) public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/home","/vendor/**","/image/**","/home/**").permitAll() .antMatchers("/admin/**").hasRole("EDMIN_ROLE") .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .defaultSuccessUrl("/home") .and() .logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));} } } 

Désolé pour mon anglais et merci de lire ma réponse.

Vous devez définir l’encodeur de mot de passe comme suit:

 @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } 

Il est nécessaire d’utiliser passwordEncoder pour les utilisateurs et aussi pour les clients dans Spring Boot 2

Découvrez ce repository https://github.com/dzinot/spring-boot-2-oauth2-authorization-jwt

Vous pouvez voir comment est configuré passwordEncoder et comment l’utiliser avec les utilisateurs et les clients de la firebase database.