티스토리 뷰
Spring Security - InMemory User 사용하기
- 시큐리티가 기본적으로 생성해주는 User를 사용하는것이 아닌 우리가 직접 생성한 유저정보를 사용하도록 설정한다.
기본 시큐리티 유저 커스터마이징 하기
- 스프링 부트 애플리케이션을 실행하면 다음과 같이 Log에 매번 새로운 비밀번호가 설정된 것이 남는다.
- 이러한 자동 설정은 어디서 오는것일까 ?
- 로그에서 그 힌트를 제공하고 있다.
- UserDetailsServiceAutoConfiguration
UserDetailsServiceAutoConfiguration
- 다음은 우리가 Log에서 힌트를 얻었던 UserDetailsServiceAutoConfiguration 클래스이다.
- 이중에서 유심히 살펴봐야 할것은 inMemoryUserDetailsManager Method 이다.
- 좀더 자세히 살펴보자.
- SecurityProperties로 부터 User 정보를 받아 기본 유저 정보를 생성하는것 처럼 보인다.
- 그렇다면 SecurityProperties 클래스는 어떻게 구성되어 있을까 ?
SecurityProperties
- spring.security 를 prefix로 설정을 주입받아 사용 할 수 있다.
예상 한것과 마찬가지로 내부적으로 랜덤하게 생성하고 있었다.
- 패스워드를 지정해준다면 passwordGenerated 가 false가 되며 더이상 유저가 생성되지 않는다.
- 그렇다면 정말 그런 설정이 가능한지 한번 테스트를 진행해보자.
다음과 같이 application.properties 파일에 설정을 진행한다.
설정을 진행하고 난뒤 다시 스프링부트 애플리케이션을 실행하면, 이전과는 달리 패스워드가 자동설정되던 Log가 없다.
결과
- http://localhost:8080/admin 으로 요청을 보내면 폼 인증을 위한 시큐리티 기본 로그인폼이 나타난다.
- admin/1234 로 인증을 진행하면 인증이 완료되고 ADMIN role을 가지고 있기때문에 admin 페이지로 접근이 가능해진다.
- 하지만 유저를 1명이상 생성이 불가능하다.
유저 를 여러명 생성하기
- properties 에 설정된 값들을 모두 제거하고 SecurityConfig 클래스로 이동한다.
- AuthenticationManagerBuilder 를 가지는 configure Method를 Override 한다.
- 인증 방법은 다양한다.
- inMemory
- Jdbc
- Ldap
- ...
- 그중에서 inMemory를 사용한다.
- 이전 properties 설정과 크게 다르진 않지만 눈에 띄는 설정은 바로 password 부분이다.
- password 부분을 좀 더 살펴보자.
- password 앞에 prefix로 {noop} 이라는 문자열이 붙는다.
- 왜 그럴까 ?
- Security 5.x 부터 기본 패스워드 인코더가 변경되었다.
- 이전과는 방식이 바뀌어 해당 패스워드가 어떠한 암호화방식으로 암호화 되었는지를 알려주는 prefix 문자열이다.
- 해당 prefix문자열이 없다면, 잘못된 값이라고 판단, 예외를 발생시킨다.
해결되지 않은 문제
- 유저가 추가될때마다 설정파일을 열어 추가해야한다.
'Spring' 카테고리의 다른 글
Spring Security - PasswordEncoder (0) | 2019.09.08 |
---|---|
Spring Security - JPA 연동하기 (0) | 2019.09.08 |
Spring Security - Security Config (0) | 2019.09.07 |
Spring Security - Security 적용하기 (0) | 2019.09.07 |
Spring Security - Project Setting (0) | 2019.09.05 |
댓글