2016-04-12 8 views
1

Ich habe Probleme, meinen Angular2-Client mit meinem Spring-Server zu kommunizieren, da ich Spring-Sicherheit hinzugefügt habe, nämlich wenn ich versuche, ein JSON mit Authentifizierungsinformationen an die Server-Login-URL zu senden Ich erhalte eine 403 "Ungültiges CSRF-Token 'null' wurde im Anforderungsparameter '_csrf' oder in der Kopfzeile 'X-CSRF-TOKEN' gefunden."Spring sendet kein CSRF-Token bei Antwort

Ich verstehe, dass ich ein Token auf dem Header meiner Antworten übergeben sollte, um vom Client verwendet zu werden, aber dieses Token wird nicht übergeben. Ich habe versucht this answer, aber das Token wird immer noch nicht übergeben. Ich sende auch Anfragen über den Postboten und der Token kommt auch nicht an.

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; 
    } 

} 

Antwort

1

Typo Möglicherweise in:

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

muss X-CSRF-TOKEN statt X-XSRF-TOKEN sein. Refactoring vorschlagen.

Check this link: How to access Spring CSRF restful web service

+0

Der Header noch nicht in der Antwort übergeben wird – napstablook

+0

haben Sie, wenn Sie in Cookie CSRF überprüft? – Jarek

+0

Ich tat, kein Cookie wurde zurückgegeben – napstablook