본문 바로가기
프로그래밍/Spring

java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" 해결

by Mr-후 2019. 1. 10.
반응형


java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"  해결


스프링부트의 자동구성과 관련된 사용자 정의 보안 구성하기를 따라하다 보니 인메모리의 테이블에 로그인 정보를 넣어 두고 로그인을 하니 저런 오류가 뜬다. 

PasswordEncoder에 대한 처리가 필요한 모양인데 아직은 무슨 말인지 모르겠다. 보안에 대한 정확한 요구사항이 있다면 어느 부분을 수정해야할지 파악을 해서 작업을 하면 되겠지만, 아직은 잘 모르겠다. 대략적으로 어떤식의 사용자 정의 보안 구성이 어떻다는 정도만 알 수 있다. 

이에 대해 자세히 설명한 글이 있는데 다음 URL을 참고하시길. 

https://thecodinglog.github.io/spring/security/2018/05/25/spring-security-2.html (Spring Security Reference 따라하기 2)


위의 URL에서 보고 PasswordEncoder @Bean을 추가했더니 정상적으로 로그인 되었고, 문제가 해결되었다. 

스프링 부트에서 구성한 Security 에 대한 예시 코드를 함께 올린다. 그런데 deprecate된 패키지가 좀 많은 것 같다. 


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;

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;

import org.springframework.security.core.userdetails.UserDetails;

import org.springframework.security.core.userdetails.UserDetailsService;

import org.springframework.security.core.userdetails.UsernameNotFoundException;

import org.springframework.security.crypto.password.NoOpPasswordEncoder;

import org.springframework.security.crypto.password.PasswordEncoder;


@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired

private ReaderRepository readerRepository;


@Override

protected void configure(HttpSecurity http) throws Exception {

http

.authorizeRequests()

.antMatchers("/").access("hasRole('READER')")  //READER권한 필요 

.antMatchers("/**").permitAll()

.and()

.formLogin()

.loginPage("/login") //로그인 폼 경로 설정 

.failureUrl("/login?error=true"); 

}


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.userDetailsService(new UserDetailsService() {

@Override

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

return (UserDetails) readerRepository.findAll().get(0);

//return (UserDetails) readerRepository.findById(username);

}

});

}


@Bean

public PasswordEncoder noOpPasswordEncoder() {

return NoOpPasswordEncoder.getInstance();

}

}


현재 보고 있는 책의 스프링부트 버전이 옛날꺼라 그런감이 있는데 아직 전반적인 사항을 몰라, 어떤식으로 변경해야하는지 잘 모르겠다. 또 필요하면 찾아보면 되겠지 ^^ 



반응형