как настроить CSFR для сервера rest rest spring? - PullRequest
0 голосов

Я пытаюсь настроить CSFR для моего остального сервера, однако я получаю ошибку 401 для запросов.

Конфигурация безопасности Spring:

private static final String[] CSRF_IGNORE = {"/api/users/login/**"};

@Autowired
    CsrfTokenResponseHeaderBindingFilter csrfTokenResponseHeaderBindingFilter;

- метод настройки

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and()
            .csrf().ignoringAntMatchers(CSRF_IGNORE)
            .and()
            .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .headers().frameOptions().sameOrigin()
            .and()
            .authorizeRequests()
            .antMatchers("/",
                    "/favicon.ico",
                    "/**/*.png",
                    "/**/*.gif",
                    "/**/*.svg",
                    "/**/*.jpg",
                    "/**/*.html",
                    "/**/*.css",
                    "/**/*.js",
                    "/static/**",
                    "/static/css/*",
                    "/static/js/*",
                    "/*.js",
                    "/*.json",
                    "/*.ico"
            ).permitAll()
            .antMatchers(SIGN_UP_URLS).permitAll()
            .antMatchers(H2_URL).permitAll()
            .anyRequest().authenticated()
    ;

    http.addFilterAfter(csrfTokenResponseHeaderBindingFilter, CsrfFilter.class);
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
}

CsrfTokenResponseHeaderBindingFilter

 @Component
    public class CsrfTokenResponseHeaderBindingFilter extends OncePerRequestFilter {
        protected static final String REQUEST_ATTRIBUTE_NAME = "_csrf";

        protected static final String RESPONSE_HEADER_NAME = "X-CSRF-HEADER";
        protected static final String RESPONSE_PARAM_NAME = "X-CSRF-PARAM";
        protected static final String RESPONSE_TOKEN_NAME = "X-CSRF-TOKEN";

 @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, javax.servlet.FilterChain filterChain) throws ServletException, IOException {
        CsrfToken token = (CsrfToken) request.getAttribute(REQUEST_ATTRIBUTE_NAME);

            if (token != null) {
            //X-CSRF-TOKEN
            response.setHeader(RESPONSE_HEADER_NAME, token.getHeaderName());
            //_csrf
            response.setHeader(RESPONSE_PARAM_NAME, token.getParameterName());

            response.setHeader(RESPONSE_TOKEN_NAME , token.getToken());
        }
        filterChain.doFilter(request, response);
    }
}

REACT_configuration:

1) токен чтения:

axios.interceptors.response.use(function(response){


        const token = response.headers['x-csrf-token'];
        localStorage.setItem("csfrToken", token);


      return response;

  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

2) установить токен на запрос:

axios.interceptors.request.use(function (config) {


    const csfrToken = localStorage.csfrToken;
    axios.defaults.headers.common["X-CSRF-TOKEN"] = csfrToken;



    return config;

  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

В результате этого кода у меня 401 Несанкционированная ошибка. Без CSFR работает хорошо. В ответ у меня есть значение токена csfr, в заголовке запроса у меня есть значение токена: (X-CSRF-TOKEN: "a6b71bfb-d605-4dcc-8e48-35dd755b589f", например)

...