작성
·
282
0
안녕하세요. security class 설정을 SecurityConfig class 와 application.properties 에 나눠서 하고 있는데,
혹시 @Configuration 과 application.properties 를 통한 설정의 차이는 무엇인가요?
감사합니다.
답변 4
2
일단 계정을 생성하는 예를 기준으로 해서 설명하겠습니다.
스프링 부트에서는 application.properites 에 값을 설정하게 되면 원하는 설정클래스를 만들어서 읽어드려 사용할 수 있습니다.
가령 application.properites 에
spring.security.user.name=leaven 라고 되어 있다면 아래와 같이 클래스를 생성할 수 있습니다.
@ConfigurationProperties(prefix = "spring.security.user")
public class SecurityProperties {
private String name
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
@ConfigurationProperties(prefix = "spring.security.user")
보시면 prefix 에 해당하는 값을 제외한 name 값에 해당하는 "leaven"을 얻을 수 있습니다.
실제로 스프링 시큐리티에도 SecurityProperties 클래스가 있고 초기화 시 이 클래스를 사용해서 사용자 계정을 생성하고 있습니다.
@Lazy
public InMemoryUserDetailsManager inMemoryUserDetailsManager(SecurityProperties properties,
ObjectProvider<PasswordEncoder> passwordEncoder) {
SecurityProperties.User user = properties.getUser();
List<String> roles = user.getRoles();
return new InMemoryUserDetailsManager(
User.withUsername(user.getName()).password(getOrDeducePassword(user, passwordEncoder.getIfAvailable()))
.roles(StringUtils.toStringArray(roles)).build());
}
inMemoryUserDetailsManager(SecurityProperties properties) : DI 하고 있습니다.
그리고 중간쯤에 보시면
SecurityProperties.User user = properties.getUser();
user 객체를 얻어와서 계정을 생성하는 로직을 구현하고 있습니다.
이것이 application.properites 를 사용하는 방식입니다.
또 하나는 SecurityConfig 와 같은 설정클래스에서 계정을 생성하는 방식인데
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("user").password("{noop}1111").roles("USER");
}
와 같이 할 수 있습니다.
스프링 시큐리티에서는 두가지 방식을 모두 지원하는데 만약 동시에 두가지 방식으로 설정을 한 상태이면 첫번째 방식은 무시되고 두번째 방식으로 계정을 생성합니다. 즉 우선순위가 SecurityConfig 설정이 더 높습니다.
만약 SecurityConfig 에서 별도의 설정을 하지 않는다면 application.properties 에서 읽어드려 계정을 생성하고 application.properties 에도 아무런 설정을 하지 않는다면 스프링 시큐리티가 SecurityProperties 클래스에 기본적으로 생성되는 user 정보를 가지고 계정을 제공합니다.
기본적으로 제공되는 계정 정보는 username 은 "user" 이고 password 는 랜덤한 UUID 입니다.
0
0
는 강의 뒤편에 강사님이 하셨네요 ㅎㅎ..