2016-10-25 6 views
4

私は、次のCSRF-設定があります。春ブーツとCSRF - Forbitten 403 - 私の春ブーツ/ AngularJSアプリケーションで>間違ってログアウト

:CSRF-トークンフィルターは次のようになります

@Override 
protected void configure(final HttpSecurity http) throws Exception { 
    http.csrf().csrfTokenRepository(csrfTokenRepository()); http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 

    final String[] restEndpointsToSecure = WebSecurityConfig.restEndpointsToSecure; 
    for (final String endpoint : restEndpointsToSecure) { 
     http.authorizeRequests().antMatchers("/" + endpoint + "/**").hasRole(UserRoleEnum.USER.toString()); 
    } 

    http.addFilterAfter(csrfTokenResponseHeaderBindingFilter(), CsrfFilter.class); 

    xAuthTokenConfigurer.setDetailsService(userDetailsServiceBean()); 
    final SecurityConfigurer<DefaultSecurityFilterChain, HttpSecurity> securityConfigurerAdapter = xAuthTokenConfigurer; 
    http.apply(securityConfigurerAdapter); 
} 

@Override 
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, javax.servlet.FilterChain filterChain) 
     throws ServletException, IOException { 

    final CsrfToken csrf = (CsrfToken)request.getAttribute(CsrfToken.class.getName()); 
    if (csrf != null) { 
     Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
     final String token = csrf.getToken(); 
     if (cookie == null || token != null && !token.equals(cookie.getValue())) { 
      cookie = new Cookie("XSRF-TOKEN", token); 
      cookie.setPath("/"); 
      response.addCookie(cookie); 
     } 
    } 
    filterChain.doFilter(request, response); 
} 

通常は正常に動作しますが、リクエストヘッダプロパティX-XSRF-TOKENはリクエストごとに送信されます。しかし、私は奇妙な行動をしています。 私はアプリケーションで自分のユーザープロフィールを更新します。初めて正常に動作したとき、2番目のHTTP 403 Forbiddenを取得しましたが、実際になぜそれが実際にはわかりません。 私はこの2つのアップデートの間に何もしません(この2つのアップデートの間の他のページへのナビゲーションはありません)。

左下の画像は左側の画像で、右側の画像は正常な画像です。唯一の違いは、右側のプロパティーがセットクッキーです。レスポンスヘッダーにX-Application-contextがありません。要求ヘッダは等しい。

私がここで間違っていることを誰もが知っていますか?私のためにここの神秘的な種類。

enter image description here

+0

角度コードを投稿できますか?具体的にはあなたの角度ルートコード。 –

+0

これは、任意の2番目の試行の共通の動作ですか、それともプロファイルの更新のみですか? – sura2k

答えて

0

あなたfront-enduserProfile.controller

にでリクエストヘッダが同じになっているあなたのクッキーセッションIDリダイレクトフォーム、いくつかの機能errorがあるかもしれないかのように思えます応答ヘッダーこの結果、INVALID_SESSIONIDは、それゆえ、ユーザははあなたのフロントエンドコントローラを修正するか、この解決策としてログインページたり登録ページ

をリダイレクトされるか、このための別の回避策として、あなたは追加することができますコードに従う

  • CORSが検出された場合にのみCORSヘッダーを追加し、ユーザーのコンテンツにアクセスできるように発信元ヘッダーを渡します。 HTTPとOPTIONS要求へ
  • 応答し200メッセージ

    static final String ORIGIN = "Origin"; 
    
    if (request.getHeader(ORIGIN).equals("null")) { 
         String origin = request.getHeader(ORIGIN); 
         response.setHeader("Access-Control-Allow-Origin", "*");//* or origin as u prefer 
         response.setHeader("Access-Control-Allow-Credentials", "true"); 
         response.setHeader("Access-Control-Allow-Headers", 
           request.getHeader("Access-Control-Request-Headers")); 
        } 
        if (request.getMethod().equals("OPTIONS")) { 
         try { 
          response.getWriter().print("OK"); 
          response.getWriter().flush(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
    

    は、次に呼び出されるカスタムフィルタを追加し

     //your other configs 
         < security:custom-filter ref="corsHandler" after="PRE_AUTH_FILTER"/> 
    

全帰属がauthorによってこのthread答えに行きます

+0

ご回答いただきありがとうございます。 **フロントエンドコントローラ**で何が間違っていた可能性がありますか? – quma

+0

初めてログインするときのセッションIDは異なり、競合しませんが、アンファヘッダーのセッションIDを更新しようとすると、あたかも同じであるかのようにantwortヘッダーと競合します。セキュリティエラーのためIDとログアウト –