[SPRING] HTTP 405 허용되지 않음 - 스프링 부트 + 스프링 보안
SPRINGHTTP 405 허용되지 않음 - 스프링 부트 + 스프링 보안
데이터베이스와 함께 작동하는 간단한 휴식 API가 있습니다. 보안 부분을 추가 할 때까지 제대로 작동했습니다. 이제 POST 및 DELETE 요청에 HTTP 405 Not Allowed가 제공됩니다. 나는 이유를 모른다. GET 요청이 제대로 작동합니다.
컨트롤러 클래스는 다음과 같습니다.
@Controller
public class MarkerController {
private Logger logger = Logger.getLogger(MarkerController.class.getName());
@Autowired
private MarkerServiceInterface markerService;
@RequestMapping(value="/markers", method=RequestMethod.GET)
public @ResponseBody List<Marker> getMarkers(@RequestParam(value="city", defaultValue="") String city) {
logger.info("HANDLE GET REQUEST");
return this.markerService.getAllMarkers();
}
@RequestMapping(value="/markers/new", method=RequestMethod.POST)
public @ResponseBody Marker addMarker(@RequestBody Marker marker) {
logger.info("HANDLE POST REQUEST");
this.markerService.addMarker(marker);
return marker;
}
@RequestMapping(value="/markers/delete", method=RequestMethod.DELETE)
public @ResponseBody String deleteMarker(@RequestParam(value="id", defaultValue="") String id) {
logger.info("HANDLE DELETE REQUEST");
if (!id.equals("")) {
logger.info(id);
this.markerService.deleteMarker(Long.parseLong(id));
}
return "";
}
@RequestMapping(value="/admin/map")
public String trafficSpy() {
logger.info("HANDLE MAP");
return "index";
}
@RequestMapping(value="/admin")
public String admin() {
return "admin";
}
@RequestMapping(value="/login")
public String login() {
return "login";
}
}
이것은 SecurityConfig입니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(
passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**")
.access("hasRole('ROLE_ADMIN')")
.antMatchers("/markers/**")
.access("hasRole('ROLE_USER')")
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.and()
.csrf()
.and()
.exceptionHandling()
.accessDeniedPage("/403");
}
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
@Bean
public DaoAuthenticationProvider authProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
}
DELETE 요청은 다음 ajax 코드와 함께 호출됩니다.
$.ajax({
url: "localhost:8080/markers/delete?id=" + currentMarker.get("id"),
type: 'DELETE',
success: function(result) {
console.log(result);
}
});
다음은 콘솔에 주어진 메시지입니다.
2015-05-11 15:48:13.671 WARN 8279 --- [nio-8181-exec-6] o.s.web.servlet.PageNotFound : Request method 'DELETE' not supported
응답의 헤더입니다. 나는 AlLLOW에서 GET과 HEAD 만 볼 수 있습니다. 그래서 내가 맞다면 이것은 컨트롤러의 메소드가 GET과 HEAD 요청 만 받아들이는 것을 의미합니다.
(Status-Line) HTTP/1.1 405 Method Not Allowed
Server Apache-Coyote/1.1
x-content-type-options nosniff
x-xss-protection 1; mode=block
Cache-Control no-cache, no-store, max-age=0, must-revalidate
Pragma no-cache
Expires 0
X-Frame-Options DENY
Allow GET, HEAD
Content-Type application/json;charset=UTF-8
Transfer-Encoding chunked
Date Mon, 11 May 2015 17:35:31 GMT
응답에서 나는이 예외가있다 :
org.springframework.web.HttpRequestMethodNotSupportedException
이 문제의 원인은 무엇입니까? POST 및 DELETE 메소드를 허용하려면 어떻게합니까?
해결법
-
==============================
1.csrf-Token을 잊어 버렸습니다.
csrf-Token을 잊어 버렸습니다.
메타 태그에 csrf-Token을 추가하는 것이 좋습니다. Spring Security Documentation에서 읽을 수있다.
이를 통해 다음을 수행 할 수 있습니다.
$(function () { var token = $("meta[name='_csrf']").attr("content"); var header = $("meta[name='_csrf_header']").attr("content"); $(document).ajaxSend(function(e, xhr, options) { xhr.setRequestHeader(header, token); }); });
-
==============================
2.마누 지 (Manu Zi)의 대답이 정확한 것이기는하지만,이 문제를 처음 접했고이 해답을 발견 한 이유가 즉시 나에게 분명하지 않았기 때문에 추가 솔루션을 남기고 싶었습니다.
마누 지 (Manu Zi)의 대답이 정확한 것이기는하지만,이 문제를 처음 접했고이 해답을 발견 한 이유가 즉시 나에게 분명하지 않았기 때문에 추가 솔루션을 남기고 싶었습니다.
근본적인 문제는 405 Method Not Allowed의 즉각적인 문제로 인해 흐려졌습니다.
제 경우에는 두 가지 요소가있었습니다. 첫째, 내 AccessDenied 컨트롤러에 대한 POST 메서드가 없었기 때문에 POST 메서드가 거부되고 AccessDenied 컨트롤러로 리디렉션 될 때 405가 발생했습니다. 이것은 org.springframework.web에서 디버그 로깅을 시작한 후에 만 나타납니다.
그것이 명확 해지자, 나는 왜 내가 접근을 거부하게되었는지를 알아내는 문제였습니다. 모든 권한과 역할은 올바르지 만 Spring 3에서 4로 업그레이드하면 CSRF 보호가 기본적으로 활성화되어있는 것으로 나타났습니다. 그것은 장애가 있거나 Manu Zi의 솔루션을 사용해야합니다.
비활성화하려면 다음을 참조하십시오. 스프링 보안 4 xml을 통한 csrf 비활성화
from https://stackoverflow.com/questions/30171265/http-405-not-allowed-spring-boot-spring-security by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Java 스프링 mvc : IllegalStateException : [java.lang.String] 유형의 값을 필수 유형으로 변환 할 수 없습니다. (0) | 2019.05.26 |
---|---|
[SPRING] Spring Data JPA - 검색 후 일시적인 필드를 설정하는 방법 (0) | 2019.05.25 |
[SPRING] SpEL 키가있는 @Cacheable : 항상 null로 평가됩니다. (0) | 2019.05.25 |
[SPRING] eclipse에서 Maven 종속성이 WEB-INF / lib로 복사되지 않음 (0) | 2019.05.25 |
[SPRING] PostgreSQL의 HikariCP : setQueryTimeout (int)가 아직 구현되지 않았습니다. (0) | 2019.05.25 |