포스트

02.Security Config 클래스

Security 버전별 구현

스프링 부트 2.x.x ~ 2.6.x (시큐리티 5.x.x ~ 2.6.x)

1
2
3
4
5
6
7
8
9
10
11
12
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    http
      .authorizeRequests()
        .antMatchers("/").authenticated()
        .anyRequest().permitAll();

  }
}
  • WebSecurityConfigurerAdapter 클래스를 상속받아 구현

스프링 부트 2.7.x ~ 3.0.x (시큐리티 5.7.x M2 ~ 3.0.x)

1
2
3
4
5
6
7
8
9
10
11
12
13
public class SpringSecurityConfig {

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

      http
          .authorizeHttpRequests()
                .requestMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated();

      return http.build();
  }
}
  • 상속 없이 빈으로 등록하여 구현

스프링 부트 3.1.x ~ (시큐리티 6.1.x ~)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SpringSecurityConfig {

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

      http
          .authorizeHttpRequests((auth) -> auth
                .requestMatchers("/login", "/join").permitAll()
                .anyRequest().authenticated()
      );

      return http.build();
  }
}
  • 이전 버전에서 빌드 방식으로 설정하던 것들이 람다식 설정으로 바뀜

Security Config

  • 인가 설정을 진행하는 클래스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{

    http
            .authorizeHttpRequests((auth) -> auth
                    .requestMatchers("/", "/login").permitAll()
                    .requestMatchers("/admin").hasRole("ADMIN")
                    .requestMatchers("/my/**").hasAnyRole("ADMIN", "USER")
                    .anyRequest().authenticated()
            );

    return http.build();
  }
}
  • permitAll() : 모두 접근 가능
  • hasRole() : 특정 역할을 가진 사용자만 접근 가능
  • hasAnyRole() : 역할 등록을 여러개 가능
  • anyRequest() : 위에서 설정한 경로를 제외한 나머지 경로
  • authenticated() : 로그인(인증)이 되었으면 접근 가능
  • 코드 작성시 위에서부터 권한을 설정하므로 순서를 잘 지켜야 한다.
  • 만약 anyRequest().authenticated() 를 먼저 작성해 버리면 밑의 경로들은 무시된다.
참고 사이트

개발자 유미