본문 바로가기
TroublesShooting

[Spring Boot] Security6에서 FormLogin으로 로그인 해결하는 법

by 배준오 2023. 12. 7.
반응형

레퍼런스를 참고하며 자바/스프링으로 CRUD 구현 중 

레퍼런스의 스프링/시큐리티 버전과 현재 버전이 달라 공식 문서를 참고하며 현재 버전에 적용하는 방법을 찾았다.

 

필자의 버전

스프링 부트 버전: 3.2.0

스프링 시큐리티 버전: 6.2

 

기존의 FormLogin으로 구현한 방법은 다음과 같다.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

@Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(auth -> auth.anyRequest().permitAll())
                .authorizeHttpRequests(auth -> auth
                        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
                        .mvcMatchers(
                                HttpMethod.GET,
                                "/",
                                "/articles",
                                "/articles/search-hashtag"
                        ).permitAll()
                        .anyRequest().authenticated()
                )
                .formLogin().and()
                .logout()
                        .logoutSuccessUrl("/")
                        .and()
                .build();
    }
}

 

Spring Security 6.1.0부터는

공식 문서를 참고하면 메서드 체이닝의 사용을 지양하고 람다식을 통해 함수형으로 설정하게 지향하라고 한다.

 

Configuration Migrations :: Spring Security

The Lambda DSL is present in Spring Security since version 5.2, and it allows HTTP security to be configured using lambdas. You may have seen this style of configuration in the Spring Security documentation or samples. Let us take a look at how a lambda co

docs.spring.io

아 참고로 Spring Security 6.0이상부터 anyMatcher, mvcMatcher 등이 사라지므로 requestMathcers로 대체한다.

 

What’s New in Spring Security 6.0 :: Spring Security

Spring Security 6.0 provides a number of new features. Below are the highlights of the release.

docs.spring.io

 

함수형으로 지향해보자

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> auth
                        .requestMatchers(
                                PathRequest.toStaticResources().atCommonLocations()).permitAll()
                        .requestMatchers(
                                HttpMethod.GET,
                                "/",
                                "/articles",
                                "/articles/search-hashtag"
                        ).permitAll()
                        .anyRequest().authenticated())
                .formLogin(formLogin -> 
                			formLogin
                            .loginPage("/login")
                            .permitAll()
                        .logoutSuccessUrl("/").permitAll());
        return http.build();
    }
}

 

위와 같이 formLogin에서 람다식으로 바꿔주면 된다하는데 내 프로젝트 환경에서는 모든 페이지에 /login 경로로 무한 Redirect 요청이 간다. /login 경로의 페이지는 Redirect 요청 좀 그만 하라고 들어가지지도 않는다.(아직 이유 못찾음)

그래서 다음과 같이 코드를 수정했더니 문제가 해결할 수 있었다.

바뀐 부분 formLogin 람다식 -> Customizer.withDefaults()로 설정

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(auth -> auth
                        .requestMatchers(
                                PathRequest.toStaticResources().atCommonLocations()).permitAll()
                        .requestMatchers(
                                HttpMethod.GET,
                                "/",
                                "/articles",
                                "/articles/search-hashtag"
                        ).permitAll()
                        .anyRequest().authenticated())
                .formLogin(Customizer.withDefaults())
                .logout(logout -> logout
                        .logoutSuccessUrl("/").permitAll());
        return http.build();
    }
}

 

반응형

'TroublesShooting' 카테고리의 다른 글

[Django] python manage.py runserver 무한 기다림  (1) 2024.01.10