본문 바로가기

Backend/Spring | SpringBoot

[Spring Security] SpringSecurityConfig 적용

반응형

클래스 생성

공식 문서를 확인해보니 Spring Security 5.7.0-M2버전 부터 WebSecurityConfigurerAdapter가 deprecated되었다고 한다.

(공식 문서 : https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter)

사용 예제 : https://docs.spring.io/spring-security/reference/servlet/authentication/passwords/index.html#publish-authentication-manager-bean

위 링크 안에 deprecated에 대해 대처하는 방법도 있으니 참고 하기 바람.

 

이 글에서는 Spring Security 6.0 이후 버전을 사용하기 때문에 이후 버전으로 세팅하는 법을 작성하려고 한다.

 

config Class

import static org.springframework.security.config.Customizer.withDefaults;

import javax.sql.DataSource;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;


@RequiredArgsConstructor
@Configuration
public class SpringSecurityConfig {

  // HttpSecurity를 통해 HTTP보안 설정 구성
  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
        .authorizeHttpRequests((authz) -> authz
            .anyRequest().authenticated()
        )
        .httpBasic(withDefaults());
    return http.build();
  }

  // 예외 처리할 요청(요청을 무시하는 경우 HttpSecurity.authorizeHttpRequests를 통해 prmitAll주는 것을 권장)
  @Bean
  public WebSecurityCustomizer webSecurityCustomizer() {
    return (web) -> web.ignoring().requestMatchers("/ignore1", "/ignore2");
  }

  // JDBC 인증
  @Bean
  public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
        .setType(EmbeddedDatabaseType.H2)
        .addScript(JdbcDaoImpl.DEFAULT_USER_SCHEMA_DDL_LOCATION)
        .build();
  }

  @Bean
  public UserDetailsManager users(DataSource dataSource) {
    UserDetails user = User.withDefaultPasswordEncoder() // 실제로는 hashing하여 사용을 권장
        .username("user")
        .password("password")
        .roles("USER")
        .build();
    JdbcUserDetailsManager users = new JdbcUserDetailsManager(dataSource);
    users.createUser(user);
    return users;
  }

  // In-Memory 사용자 인증
  @Bean
  public InMemoryUserDetailsManager userDetailsService() {
    UserDetails user = User.withDefaultPasswordEncoder() // 실제로는 hashing하여 사용을 권장
        .username("user")
        .password("password")
        .roles("USER")
        .build();
    return new InMemoryUserDetailsManager(user);
  }
}

 

하나하나 뜯어보기

 

+ ) antMatchers가 동작하지 않는 이유

spring-security 5.8 이상의 버전을 사용하는 경우에는 antMatchers, mvcMatchers, regexMatchers가 더 이상 사용되지 않기 때문에, requestMatchers를 사용해야 함

반응형