본문 바로가기
IT/SpringBoot

[SpringBoot] ... is deprecated and marked for removal

by se-black 2024. 1. 21.

SpringSecurity관련 config 작성시 에러 2

 

[SpringBoot] Cannot resolve method 'antMatchers' in 'ExpressionInterceptUrlRegistry'

SpringSecurity관련 config 작성시 에러 1 새로 공부삼아 진행해보던 프로젝트에서, 이전에 진행했던 프로젝트를 참고하여 SpringSecurity관련 config 코드 작성 중에 아래의 코드에서 에러가 발생하였다. pa

se-black.tistory.com

 

 

저번글에 이어서 SpringSecurity관련 config 코드 작성 중에 또 다른 에러가 발생하였다.

package com.saeahga.community.config;

import com.saeahga.community.handler.LoginFailureHandler;
import lombok.RequiredArgsConstructor;
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
@RequiredArgsConstructor
@EnableWebSecurity // Security 의 filterchain 을 구현하기 위한 어노테이션
public class SecurityConfigOrigin {
    private final LoginFailureHandler loginFailureHandler;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests()
                .requestMatchers("/").permitAll()
                .requestMatchers("/css/**").permitAll()
                .requestMatchers("/js/**").permitAll()
                .requestMatchers("/images/**").permitAll()
                .requestMatchers("/user/**").permitAll()
                .requestMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated();

        http.formLogin()
                .loginPage("/user/login")
                .usernameParameter("userId")
                .passwordParameter("userPw")
                .loginProcessingUrl("/user/loginProc")
                .defaultSuccessUrl("/home/main")
                .failureHandler(loginFailureHandler);

        http.logout()
                .logoutUrl("/user/logout")
                .invalidateHttpSession(true)
                .logoutSuccessUrl("/user/login");

        http.csrf().disable();

        return http.build();
    }
}

 

[에러]


원인

현재 진행하는 프로젝트 환경

- SpringBoot: 3.2.0

- SpringSecurity: 6.2.0

 

아래와 같이, 인터넷에서 많이 찾아볼 수 있는 기존의 SpringSecurity관련 config style이 SpringSecurity 6.1.0 버전부터 deprecated 되었다고 한다.

이러한 config style을 non-lambda DSL 방식이라고 한다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests()
                .requestMatchers("/blog/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .rememberMe();

        return http.build();
    }
}

 

따라서, non-lambda DSL 방식이 아닌 Lambda DSL 방식을 사용하여 SpringSecurity cofig를 구성해야 한다.

 

Lambda DSL 이란?
Lambda를 사용한 DSL이다.

 

DSL(Domain Specific Language) 이란?
DSL은 특정 비즈니스 도메인의 문제를 해결하려고 만든, 작고 범용이 아닌 특정 도메인을 대상으로 만들어진 프로그래밍 언어이다.
즉, 코드의 의미가 명확하게 전달되며 코드의 가독성을 높이기 위해 사용하는 방식이다.

 

 

[참고]

https://docs.spring.io/spring-security/reference/migration-7/configuration.html

https://github.com/spring-projects/spring-security/releases/tag/6.1.0

https://velog.io/@jmjmjmz732002/Spring-Spring-Boot-3.1.0-Spring-6.1-Spring-Security-6.1-Security-Config-deprecated

https://byungil.tistory.com/289


에러 해결

package com.saeahga.community.config;

import com.saeahga.community.handler.LoginFailureHandler;
import lombok.RequiredArgsConstructor;
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.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@RequiredArgsConstructor
@EnableWebSecurity // Security 의 filterchain 을 구현하기 위한 어노테이션
public class SecurityConfigNew {
    private final LoginFailureHandler loginFailureHandler;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.
                authorizeHttpRequests( authorizeHttpRequests ->
                        authorizeHttpRequests
                                .requestMatchers("/").permitAll()
                                .requestMatchers("/css/**").permitAll()
                                .requestMatchers("/js/**").permitAll()
                                .requestMatchers("/images/**").permitAll()
                                .requestMatchers("/user/**").permitAll()
                                .requestMatchers("/admin/**").hasRole("ADMIN")
                                .anyRequest().authenticated()
                );

        http.
                formLogin(formLogin ->
                        formLogin
                                .loginPage("/user/login")
                                .usernameParameter("userId")
                                .passwordParameter("userPw")
                                .loginProcessingUrl("/user/loginProc")
                                .defaultSuccessUrl("/home/main")
                                .failureHandler(loginFailureHandler)
                );

        http.
                logout(logout ->
                        logout
                                .logoutUrl("/user/logout")
                                .invalidateHttpSession(true)
                                .logoutSuccessUrl("/user/login")
                );

        http
                .csrf(AbstractHttpConfigurer::disable);

        return http.build();
    }
}
728x90