2017-05-24 14 views
1

Spring SecurityでSpringMVCにアプリケーションがあります。春のセキュリティXML構成ファイルでは、<csrf/>を使用してcsrfを有効にします。フォームでリンクするためにcsrfトークンを追加するとhtmlでの表示が正しく動作するようになりましたが、今はコントローラを追加して休憩通信をしたいと思っています。コントローラは、次のようになります。残りのコントローラを備えたSpringMVC - リクエストメソッド 'POST'はサポートされていません

@Controller 
public class RestControllerTest { 
    @RequestMapping(value = "/rest", method = RequestMethod.POST, produces = "application/json") 
    @ResponseStatus(value = HttpStatus.OK) 
    public @ResponseBody void setUser(@RequestBody User user){ 
     System.out.println("Witaj " + user.getFirstname() + "!"); 
    } 
} 

私は、ユーザー(使用して郵便配達)とJSONを送信しようとすると:

{ 
    "firstname": "name", 
    "lastname": "name" 
} 

私は郵便配達で404の見つからない状態を取得し、STSでWARN : org.springframework.web.servlet.PageNotFound - Request method 'POST' not supported。私はcsrfトークンを使用しなければならないことを知っていますが、私はこれを行う方法がわかりません。 enter image description here

+1

アプリケーションは正常に展開されていますか?このデータを投稿しようとしている完全なURLは何ですか? –

+0

はい、アプリケーションは正常に動作します。ビューを返すコントローラはすべて正常に動作します。私はcsrfを無効にすると、私は郵便配達員を使ってjsonユーザーを送ることができます。しかし、csrfを有効にすると、残念なことに問題の魔法のポスト方法があります。 – lukhol

+1

csrfトークンの場合:https://stackoverflow.com/questions/27182701/how-do-i-send-spring-csrf-token-from-postman-rest-client 説明した問題はありませんトークンの不足があなたに403を与えるので、それによって引き起こされることになります。 それはコントローラ全体ですか?あなたは、クラスのプレフィックスリクエストマッピングを持っていますか? 編集 - あなたの応答を見ただけです。したがって、csrfを無効にすると、郵便配達の同じ要求が機能しますか? – chaos

答えて

1

私はあなたと同じように働くケースがあります。私の場合、これは物事の様子です。

マイFilterクラス - 以下

public class MyCsrfFilter extends OncePerRequestFilter { 

    @Override 
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, 
     FilterChain filterChain) 
      throws Exception { 
     CsrfToken csrf = (CsrfToken) request.getAttribute(org.springframework.security.web.csrf.CsrfToken.class.getName()); 
     if (csrf != null) { 
      Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
      String token = csrf.getToken(); 
      if (cookie == null) { 
       cookie = new Cookie("XSRF-TOKEN", token); 
       cookie.setPath(YOUR_DOMAIN_NAME); 
       cookie.setHttpOnly(true); 
       response.addCookie(cookie); 
      } 
     } 
     filterChain.doFilter(request, response); 
    } 

} 

春ブートのセキュリティ設定です。必要な場合は、それを同等のXML設定ファイルに変換することができます。

@Configuration 
@EnableWebMvcSecurity 
public class CustomWebSecurityConfiguration extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.csrf() 
       .csrfTokenRepository(getTokenRepo()) 
       .and() 
       .authorizeRequests() 
       .antMatchers("/login", "/login**").permitAll() 
       .and() 
       .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class); 
    } 

    private CsrfTokenRepository getTokenRepo() { 
     HttpSessionCsrfTokenRepository repo = new HttpSessionCsrfTokenRepository(); 
     repo.setHeaderName("X-XSRF-TOKEN"); 
     return repo; 
     } 

関連する問題