2016-04-27 28 views
1

概要
私はSpringセキュリティに基づく認証としてAPIゲートウェイを使用します。私はちょうどhttps://spring.io/guides/tutorials/spring-security-and-angular-js/リンクのステップに従って、https://github.com/spring-guides/tut-spring-security-and-angular-js.gitの対応するgithubプロジェクトの "ペア - ダブル"モジュールに基づいてプロジェクトを作成しました。POSTリクエストの無効なCSRFトークン

問題は
問題任意のPOSTリクエストがサーバーに送信されたときに「無効なCSRFトークン」例外がスローされるという事実です。次のようにスローされた例外の例は次のとおりです。

{ 
    "timestamp": 1461714933215, 
    "status": 403, 
    "error": "Forbidden", 
    "message": "Invalid CSRF Token '1cdc44ad-43cb-44e6-b903-bec24fe903fd' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.", 
    "path": "/ui/test" 
} 

私は再確認し、問題を確認したが、無駄に。このシナリオをpostmanでテストし、POST要求のヘッダーとして 'X-XSRF-TOKEN'を設定しましたが、何も起こりませんでした。


私はSpringセキュリティアプローチの初心者であるため、誰かが私に解決策を提案できれば幸いです。

答えて

5

そのプロジェクトのセキュリティ設定を見ると、各リクエストにXSRF-TOKENのクッキーが追加されています(using a filter)。だからあなたがしなければならないことは、そのクッキーの価値を持ち、それをX-XSRF-TOKENヘッダーに格納することです。私はこのケースをテストするために同様のセキュリティ設定とテストプロジェクトを作った、完全なコードは次のようになります。

  • interceptorを有効にする:

    @RestController 
    @SpringBootApplication 
    public class TestApplication extends WebSecurityConfigurerAdapter { 
    
        public static void main(String[] args) { 
         SpringApplication.run(TestApplication.class, args); 
        } 
    
        @Override 
        protected void configure(HttpSecurity http) throws Exception { 
         http 
          .authorizeRequests() 
          .antMatchers("/**") // Disable authentication for all requests. 
          .permitAll() 
          .and() 
          .csrf().csrfTokenRepository(csrfTokenRepository()) 
          .and() 
          .addFilterAfter(csrfHeaderFilter(), SessionManagementFilter.class); // Register csrf filter. 
        } 
    
        private Filter csrfHeaderFilter() { 
         return new OncePerRequestFilter() { 
    
          @Override 
          protected void doFilterInternal(HttpServletRequest request, 
                  HttpServletResponse response, 
                  FilterChain filterChain) throws ServletException, IOException { 
    
           CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); 
           if (csrf != null) { 
            Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
            String token = csrf.getToken(); 
            if (cookie == null || token != null 
              && !token.equals(cookie.getValue())) { 
    
             // Token is being added to the XSRF-TOKEN cookie. 
             cookie = new Cookie("XSRF-TOKEN", token); 
             cookie.setPath("/"); 
             response.addCookie(cookie); 
            } 
           } 
           filterChain.doFilter(request, response); 
          } 
         }; 
        } 
    
        private CsrfTokenRepository csrfTokenRepository() { 
         HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
         repository.setHeaderName("X-XSRF-TOKEN"); 
         return repository; 
        } 
    
        @RequestMapping(value = "/test", method = RequestMethod.GET) 
        public String testGet() { 
         return "hello"; 
        } 
    
        @RequestMapping(value = "/test", method = RequestMethod.POST) 
        public String testPost() { 
         return "works!"; 
        } 
    } 
    

    は、以下を行う郵便配達でこれをテストするにはクッキーのキャプチャを開始する。

  • GET /testリクエストを実行し、[Cookie]タブを開きます。そこに名前がXSRF-TOKENのクッキーがあるはずです。
  • そのクッキーの値をとってX-XSRF-TOKENヘッダーに入れ、POST /testリクエストを実行します。
関連する問題