이전과 비교하면 매우 깔끔하게 바뀐 걸 확인할 수 있습니다.
다만, 문법이 많이 바뀌어서 강의를 들으면서 수정한 코드를 전후 비교로 올립니다!
버전 기준은 Spring Security 6.2.1 입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdaper {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
.anyRequest().permitAll()
.and()
.formLogin()
.loginPage("/login");
}
}
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable()); /* AbstractHttpConfigurer::disable */
http.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/user/**").authenticated()
.requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().permitAll()
);
http.formLogin(form -> form.loginPage("/login"));
return http.build();
}
}
첫번째 차이점은 WebSecurityConfigurerAdaper
가 deprecated되고, 상속 대신 SecurityFilterChain
를 @Bean으로 등록하는 방식으로 변경되었습니다.
// 이전
public class SecurityConfig extends WebSecurityConfigurerAdaper {}
// 최신
public class SecurityConfig {
@Bean
protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {}
}
두번째 차이점은 이전에는 http를 기준으로 메소드().메소드() 형태로 이어나갔다면, 최신 문법에서는 람다표현식을 사용합니다. 또한 .and()로 연결하지 않고, 그 아래에 새롭게 http.메소드() 형태로 이어나가시면 됩니다.
// 이전
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/user/**").authenticated()
.antMatchers("/manager/**").access("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
.antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
// 최신
http.csrf(csrf -> csrf.disable()); /* AbstractHttpConfigurer::disable */
http.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/user/**").authenticated()
.requestMatchers("/manager/**").hasAnyRole("ADMIN", "MANAGER")
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().permitAll()
);
http.formLogin(form -> form.loginPage("/login"));
return http.build();
세번째 차이점은 access 검사에서 특정 Role에 있는지 검사할 때, 텍스트로 작성하던 문법은 메소드화 되었고, ROLE_
을 붙일 필요없이 역할 이름만 작성하면 됩니다.
공부하면서 다른 문법도 추가할 예정입니다!
(ex. WebSecurityCustomizer)