2016-04-12 10 views
1

Springセキュリティを追加してから、つまり、認証情報を含むJSONをサーバーのログインURLに送信しようとすると、Angular2クライアントとSpringサーバーとの通信に問題があります。要求パラメータ '_csrf'またはヘッダー 'X-CSRF-TOKEN'で無効なCSRFトークン 'null'が見つかりました。 "レスポンスでCSRFトークンを送信しないSpring

クライアントが使用するために私の応答のヘッダーにトークンを渡す必要がありますが、このトークンは渡されないことを理解しています。私はthis answerを試しましたが、トークンはまだ渡されていません。私はまた、郵便配達員を通じてリクエストを送信しています。トークンは到着していません。

webSecurityConfig.xml

<http entry-point-ref="restAuthenticationEntryPoint"> 
     <intercept-url pattern="/api/**" access="hasRole('ROLE_USER')"/> 

     <form-login 
     authentication-success-handler-ref="mySuccessHandler" 
     authentication-failure-handler-ref="myFailureHandler" 
     /> 

     <logout /> 
    </http> 

    <beans:bean id="mySuccessHandler" 
     class="com.eficid.cloud.security.rest.AuthenticationSuccessHandler"/> 
    <beans:bean id="myFailureHandler" class= 
    "org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"/> 


     <authentication-manager> 
     <authentication-provider> 
      <user-service> 
      <user name="temp" password="temp" authorities="ROLE_USER" /> 
      </user-service> 
     </authentication-provider> 
     </authentication-manager> 

</beans:beans> 

SpringSecurityConfiguration

@Configuration 
@ImportResource({ "classpath:webSecurityConfig.xml" }) 
@ComponentScan("com.eficid.cloud.security.rest") 
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { 

    public SpringSecurityConfig() { 
     super(); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.httpBasic().and().authorizeRequests() 
       .antMatchers("/spring-security-rest/login").permitAll().anyRequest() 
       .authenticated().and().csrf() 
       .csrfTokenRepository(csrfTokenRepository()).and() 
       .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class); 
    } 


    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())) { 
         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; 
    } 

} 

答えて

1

おそらくのタイプミス:

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

はX-CSRF-TOKENの代わりに、X-XSRF-TOKENでなければなりません。リファクタリングを提案する。

チェックこのリンク:How to access Spring CSRF restful web service

+0

まだあなたがクッキーにCSRFしている場合 – napstablook

+0

はあなたがチェックした応答で渡されていないヘッダ? – Jarek

+0

私は、返されたクッキーは返されません – napstablook

関連する問題