Отправить запрос GET с именем пользователя и паролем, но попадает в ошибку кодирования пароля?
Проверенный
- Пружинный ботинок 2.1.2. ВЫПУСК
- Пружинный ботинок 2.1.2. ВЫПУСК
$ curl localhost:8080/books -u user:password { "timestamp":"2019-02-22T15:03:49.322+0000", "status":500, "error":"Internal Server Error", "message":"There is no PasswordEncoder mapped for the id \"null\"", "path":"/books" }
ошибки в журналах
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
Вот конфигурация.
package com.mkyong.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password("password").roles("USER") .and() .withUser("admin").password("password").roles("ADMIN"); } }
Решение
До версии Spring Security 5.0 по умолчанию Кодировщик пароля
был NoOpPasswordEncoder
который требовал простых текстовых паролей. В Spring Security 5 по умолчанию используется Делегирование кодировщика паролей
, для которого требуется Формат хранения паролей .
Прочитай этот и этот
Решение 1 – Добавьте формат хранения паролей, для обычного текста добавьте {noop}
package com.mkyong.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password("{noop}password").roles("USER") .and() .withUser("admin").password("{noop}password").roles("ADMIN"); } }
Решение 2 – User.withdefaultpasswordencoder()
для службы пользовательских данных
package com.mkyong.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; 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; @Configuration public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public UserDetailsService userDetailsService() { User.UserBuilder users = User.withDefaultPasswordEncoder(); InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(users.username("user").password("password").roles("USER").build()); manager.createUser(users.username("admin").password("password").roles("USER", "ADMIN").build()); return manager; } }
Рекомендации
- Spring Security 5 – Формат Хранения Паролей
- Документы по безопасности Spring – делегирование PasswordEncoder
Оригинал: “https://mkyong.com/spring-boot/spring-security-there-is-no-passwordencoder-mapped-for-the-id-null/”