Рубрики
Без рубрики

Весенняя безопасность – Для идентификатора “null” нет кодера пароля, сопоставленного с идентификатором “null”

– Пружинная Защита – Для идентификатора “null” нет кодера пароля, сопоставленного с идентификатором “null”

Отправить запрос 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");

    }

}

Решение 2User.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;

    }

}

Рекомендации

Оригинал: “https://mkyong.com/spring-boot/spring-security-there-is-no-passwordencoder-mapped-for-the-id-null/”