inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링부트 시큐리티 & JWT 강의

JWT SecurityConfig.java에서 .and() deprecated

해결된 질문

1056

msun0215

작성한 질문수 3

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 내부에 있는 함수로 인식하는거 같은데,,

 

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

spring spring-security jwt deprecated

답변 1

0

인프런 AI 인턴

안녕하세요 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() 메소드를 사용하지 않고도 필요한 권한을 연이어 설정할 수 있습니다.

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

1

msun0215

        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에 이어서 하지말고 중간에 끊고 다시 객체에 연결시켜주니 해결이 되었네요!

JWT를 구현한 다음 이 API를 호출해서 사용하는 것은 프론트엔드 쪽에서 하는 역할인가요?

0

96

1

Jwt쓰면 스프링시큐리티는 필수적으로 사용해야하나요?

0

401

1

13:23 system.out 출력문이 다르게 나옵니다.

0

130

1

수료증 문의

0

226

2

9분대에 질문이 있습니다 !

0

114

1

password 비교를 하지 않았는데 어떻게 인증이 통과된 건가요?

0

321

1

이전 강의 참고하라는 말씀

0

253

1

강의 실습하다가 막히는 분들 참고(2024년8월 기준)

2

1116

2

구글 소셜 로그인 302

0

200

1

오류 문의 _ org.springframework.orm.jpa.JpaSystemException: could not deserialize

1

584

1

[자바] 시큐리티 Config 참고

13

953

1

이론강의

0

280

1

SpringSecurity JWT 로그인 URL 2개 설정하는 방법

0

487

1

2024.06기준) 최근 SecurityConfig 설정 문의

0

921

3

구글 로그인시 authentication이 null 값이라고 에러가 발생합니다.

0

678

2

특정 url필터 거는 방법 이슈

0

422

1

강사님께서 말씀하시는 시큐리티세션이 SecurityContext인가요?

0

277

1

25강 마지막 테스트에서 오류

1

1044

2

jwt를 저장하는 위치에 궁금한 점이 있습니다.

0

298

1

mustache를 사용하지 않고 thymeleaf를 사용하려고 하는데

0

697

1

세션 인증방식이 REST 원칙에 위배되는 건가요?

0

340

1

jwt와 실제데이터의 관계

1

243

1

jwt 와 세션ID의 관계

1

313

1

SecurityConfig에서 세션 설정, 인가 설정

0

419

1