Spring Security의 의존성을 추가한 경우 위와 같이 WebSecurityConfigurerAdapter
클래스가 실행되게 됨
WebSecurityConfigurerAdapter
클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며 내부 적으로 getHttp()메서드가 실행될 때 HTTPSecurity 클래스를 생성
-> 이때 HTTPSecurity
는 인증/인가 API들의 설정을 제공
//WebSecurityConfigureAdapter.java
protected final HttpSecurity getHttp() throws Exception {
if (this.http != null) {
return this.http;
}
.....
if (!this.disableDefaults) {
applyDefaultConfiguration(this.http); // defualt Configuration 적용
.....
}
configure(this.http);
// 이곳의 configure 메서드를 override하면 우리가 원하는 보안체계를 만들 수 있습니다.
return this.http;
}
// 기본적으로 적용되는 filter들을 포함한 configuration 대한 메서드
private void applyDefaultConfiguration(HttpSecurity http) throws Exception {
http.csrf();
http.addFilter(new WebAsyncManagerIntegrationFilter());
http.exceptionHandling();
http.headers();
http.sessionManagement();
http.securityContext();
http.requestCache();
http.anonymous();
http.servletApi();
http.apply(new DefaultLoginPageConfigurer<>());
http.logout();
}
우리가 인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)
메서드를 override하며 설정
protected void configure(HttpSecurity http) throws Exception {
this.logger.debug("Using default configure(HttpSecurity). "
+ "If subclassed this will potentially override subclass configure(HttpSecurity).");
http.authorizeRequests((requests) -> requests.anyRequest().authenticated());
http.formLogin();
http.httpBasic();
}
Override 예시
// 메인 홈페이지를 누구나 접근 하게 해주기 위해 풀어주는법
// 다른 페이지는 인증을 통해
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests((requests) ->
requests.antMatchers("/").permitAll()
.anyRequest().authenticated());
http.formLogin();
http.httpBasic();
}
앞서 말했듯이 우리가 인증/인가의 설정을 바꾸고자 한다면 아래와 같아 WebSecurityConfigurerAdapter
를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)
메서드를 override하며 설정해야 함
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
// 인가 정책 설정
http
.authorizeRequests() // 요청에 대한 보안 검사 실행
.anyRequest().authenticated(); // 어떠한 요청에도 인증을 받도록 설정
// 인증 정책 설정
http
.formLogin(); // formLogin인증 방식을 사용하도록 설정
}
}
Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import({ WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class,
HttpSecurityConfiguration.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
/**
* Controls debugging support for Spring Security. Default is false.
* @return if true, enables debug support with Spring Security
*/
boolean debug() default false;
}
위의 SecurityConfig에 붙은 @EnableWebSecurity
을 보면 WebSecurityConfiguration.class, SpringWebMvcImportSelector.class, OAuth2ImportSelector.class, HttpSecurityConfiguration.class들을 import해서 실행
-> 해당 annotation을 붙여야지 Securiry를 활성화