JWT SecurityConfig.java에서 .and() deprecated
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
안녕하세요 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
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





