해결된 질문
작성
·
1K
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
안녕하세요 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() 메소드를 사용하지 않고도 필요한 권한을 연이어 설정할 수 있습니다.
만약 위의 방법으로도 문제가 해결되지 않는다면, 정확한 원인을 파악하기 위해 코드와 관련된 전체 내용과 에러 스택 트레이스를 함께 공유해주시면 더 정확한 도움을 드릴 수 있을 것입니다. 감사합니다.
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에 이어서 하지말고 중간에 끊고 다시 객체에 연결시켜주니 해결이 되었네요!