• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

JWT SecurityConfig.java에서 .and() deprecated

23.11.15 09:43 작성 조회수 607

0

Spring Boot 3.0.0에서 최신판인 Spring Boot 3.1.2로 업데이트 되면서
Spring Security도 6.1.2로 업데이터 되었습니다.

이에 따라서 강사님 github - Version3 branch에 있던 프로젝트의 SecurityConfig.java에서
중간중간에 .and()로 묶어주신 부분도 .and()가 deprecated 되면서 사용할 수 없게 되었습니다.

이에 따라

// 이전 생략

return http.csrf(CsrfConfigurer::disable)
        .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                .formLogin(f->f.disable())
                        .httpBasic(h->h.disable())
                                .apply(new MyCustomDs1())   // custom Filter
        .authorizeHttpRequests(authorize-> {     // 권한 부여
            // authorizeRequests가 deprecated됨에 따라 authorizeHttpRequests 사용 권장
            authorize
                .requestMatchers("/api/v1/user/**").hasAnyRole("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .requestMatchers("/api/v1/manager/**").hasAnyRole("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                .requestMatchers(("/api/v1/admin/**")).hasAnyRole("hasRole('ROLE_ADMIN')")
                .anyRequest().permitAll();
        });

apply(new MyCustomDs1()) 이후에 authorizeRequest 메소드를 람다식으로 변환시켜서 이어줄려고 하는데,

 

위 캡쳐 이미지와 같이 에러가 떴습니다.

내용을 보자 하니
http에 custom Filter(new MyCustomDs1())를 apply시키고 이후에 authorizeHttpRequests를 실행시켜야 하는데, authorizeHttpRequest가 MyCustomDs1 내부에 있는 함수로 인식하는거 같은데,,

 

어떻게 해결해야 하는지 방법을 공유해주시면 감사하겠습니다.

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.11.17

안녕하세요 msun0215 님, 인프런 AI 인턴이에요.

.and() 메소드가 deprecated되어 사용할 수 없게 되었다는 내용이신데요, 이 경우 대체할 수 있는 방법이 있습니다.

대체할 수 있는 방법 중 하나는 lambda 표현식을 사용하여 authorizeHttpRequests() 메소드 내의 권한 설정을 직접 구현하는 것입니다. 아래는 .and() 메소드를 lambda 표현식으로 대체한 예시 코드입니다.

return http.csrf(CsrfConfigurer::disable)
        .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        .formLogin(f->f.disable())
        .httpBasic(h->h.disable())
        .apply(new MyCustomDs1())   // custom Filter
        .authorizeHttpRequests(authorize ->  // lambda 표현식으로 권한 설정
                authorize
                        .requestMatchers("/api/v1/user/**").hasAnyRole("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                        .requestMatchers("/api/v1/manager/**").hasAnyRole("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                        .requestMatchers(("/api/v1/admin/**")).hasAnyRole("hasRole('ROLE_ADMIN')")
                        .anyRequest().permitAll()
        );

위와 같이 lambda 표현식을 사용하여 권한 설정을 직접 구현하면, .and() 메소드를 사용하지 않고도 필요한 권한을 연이어 설정할 수 있습니다.

만약 위의 방법으로도 문제가 해결되지 않는다면, 정확한 원인을 파악하기 위해 코드와 관련된 전체 내용과 에러 스택 트레이스를 함께 공유해주시면 더 정확한 도움을 드릴 수 있을 것입니다. 감사합니다.

msun0215님의 프로필

msun0215

질문자

2023.11.17

        http.csrf(cs-> cs.disable())
                .sessionManagement(s->s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
                        .formLogin(f->f.disable())
                                .httpBasic(h->h.disable())
                                        .apply(new MyCustomDs1());   // custom Filter
                //.addFilter(new JWTAuthenticationFilter(authenticationManager))
                //.addFilter(new JWTAuthorizationFilter(authenticationManager, userRepository))
        http.authorizeHttpRequests(authorize-> {     // 권한 부여
                    // authorizeRequests가 deprecated됨에 따라 authorizeHttpRequests 사용 권장
                    authorize
                            .requestMatchers("/user/**").hasAnyRole("hasRole('ROLE_USER') or hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                            .requestMatchers("/manager/**").hasAnyRole("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
                            .requestMatchers(("/admin/**")).hasAnyRole("hasRole('ROLE_ADMIN')")

//                            .requestMatchers("/user/**").hasAnyAuthority("USER","MANAGER","ADMIN")
//                            .requestMatchers("/user/**").authenticated()
//                            .requestMatchers("/manager/**").hasAnyAuthority("MANAGER", "ADMIN")
//                            .requestMatchers("/manager/**").access("hasAuthority('ROLE_ADMIN')")
//                            .requestMatchers(("/admin/**")).hasAuthority("ADMIN")
                        .anyRequest().permitAll();  // 이외의 요청은 모두 허용함
                });

        /* Spring Security 사용 시
        http.formLogin(f->f{
            f.loginProcessingUrl("/login");     // 로그인 url 설정
        });
         */

        // /user, /manager, /admin으로 들어가도 /loginForm으로 접근하도록
        return http.build();
    }

 

HttpSecurity 객체인 http에 이어서 하지말고 중간에 끊고 다시 객체에 연결시켜주니 해결이 되었네요!