-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
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 내부에 있는 함수로 인식하는거 같은데,,
어떻게 해결해야 하는지 방법을 공유해주시면 감사하겠습니다.
답변을 작성해보세요.
0
인프런 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
질문자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에 이어서 하지말고 중간에 끊고 다시 객체에 연결시켜주니 해결이 되었네요!
답변 1