앞에서 이론을 배웠으니, 다시 프로젝트 내용으로 돌아오자.
현재까지 프로젝트는 user/매번 Spring Security가 생성해주는 비번 값 으로만 로그인이 가능하니,
사용자 지정 id와 password encoder 코드를 작성해보자.
Spring Security를 통해 비밀번호 인코더 함수를 작성하자.
비밀번호 인코딩하는 함수는 자주 쓰는 함수인 BCryptPasswordEncoder를 정리해보겠다!
BCryptPasswordEncoder함수는 각 비밀번호마다 솔트를 자동으로 생성하고 적용해, 동일한 비밀번호라도 다른 해시값을 가지게 해, 실제로 아주 자주 사용하는 함수이다.
보통 사용자를 mySQL db에 저장하는데, 해당 내용은 바로 앞 시리즈에서 정리했다. 이 스프링 투두 리스트 프로젝트에서는 간단히 InMemory 설정을 사용하겠다. 회원가입을 통해 createUser을 했던 앞선 포스팅과 달리, 테스트용 개발로 몇가지 user를 미리 만들어볼 것이다.
앞에서 InMemory 설정과 잘쓰는 BCryptPasswordEncoder함수를 정리해보겠다고 했다. 정리해보자.
InMemoryUserDetailsManager클래스를 보면, 다음과 같은 생성자 확인 가능. 거기에 사용자 세부 정보를 넣어 저장할 수 있다.
public InMemoryUserDetailsManager(UserDetails... users) {
for (UserDetails user : users) {
createUser(user);
}
}
@Configuration
public class SpringSecurityConfiguration {
// InMemoryUserDetailsManager
// InMemoryUserDetailsManager(UserDetails... users)
@Bean
public InMemoryUserDetailsManager createUserDetailsManager() {
// 람다함수 - input과 output 모두 String
Function<String, String> passwordEncoder = input -> passwordEncoder().encode(input);
// passwordEncoder 함수는 어떤 input이든 내가 빈으로 설정한 passwordEncoder로 input을 인코딩한 다음,
// 그 사용자의 세부정보 저장할
UserDetails userDetails = User.builder()
.passwordEncoder(passwordEncoder)
.username("minjiki2")
.password("random")
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(userDetails);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
위 코드 실행결과, minjiki2 / random으로 로그인 성공했다!
지금까지 사용자는 minjiki2밖에 없었다. 개발 테스트용으로 유저 1개를 더 추가해보자.
유저 설정하는 곳은 SpringSecurityConfiguration이니까 해당 클래스로 간다.
@Configuration
public class SpringSecurityConfiguration {
// InMemoryUserDetailsManager
// InMemoryUserDetailsManager(UserDetails... users)
@Bean
public InMemoryUserDetailsManager createUserDetailsManager() {
UserDetails userDetails1 = createNewUser("minjiki2", "random");
UserDetails userDetails2 = createNewUser("Dev", "random2");
return new InMemoryUserDetailsManager(userDetails1, userDetails2);
}
private UserDetails createNewUser(String username, String password) {
Function<String, String> passwordEncoder = input -> passwordEncoder().encode(input);
UserDetails userDetails = User.builder()
.passwordEncoder(passwordEncoder).username(username).password(password).roles("USER", "ADMIN").build();
return userDetails;
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
createNewUser 메서드 - 사용자의 아이디와 비밀번호를 받아서, 비밀번호를 암호화하고, UserDetails를 생성한다.