Почему я должен отключить токен csrf для публикации данных с помощью почтальона? - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь выполнить некоторые вызовы REST на моем сервере (localhost), методы GET работают правильно, но, когда я пытаюсь опубликовать объекты JSON через методы postman, POST, PUT, DELETE не работает. Это говорит: «Запрос метода POST не поддерживается. "Когда я пытаюсь снова отключить токены csrf на http, все работает хорошо.

Вот мой контроллер покоя.

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.kish.Service.CustomerService;
import com.kish.entity.Customer;

@RestController
@RequestMapping("/api")
public class CRMRestController {

    public CRMRestController() {

    }

    @Autowired
    private CustomerService customerService;

    @GetMapping("/customers")
    public List<Customer> getCustomers() {


        return customerService.getCustomers();
    }

    @GetMapping("/customers/{customerId}")
    public Customer getCustomer(@PathVariable int customerId) {

        if((customerService.getCustomer(customerId) == null)) {
            throw new CustomerNotFoundException("No customer found in the database" + customerId);
        }

        return customerService.getCustomer(customerId);
    }

    @PostMapping("/customers")
    public Customer addCustomer(@RequestBody Customer customer) {

        customer.setId(0);
        customerService.saveCustomer(customer);

        return customer;

    }

    @PutMapping("/customers")
    public Customer updateCustomer(@RequestBody Customer customer) {

        customerService.saveCustomer(customer);

        return customer;
    }

    @DeleteMapping("/customers/{customerId}")
    public String deleteCustomer(@PathVariable int customerId) {

        if((customerService.getCustomer(customerId)) == null) throw new CustomerNotFoundException("request valid data");

        customerService.deleteCustomer(customerId);

        return "deleted customer id is " + customerId;

    }

}

метод настройки безопасности

 @Override  
        protected void configure(HttpSecurity http) throws Exception {

            http.csrf().disable();
            http.authorizeRequests() // restrict access based on the request coming in.
            .antMatchers("/customer/list").hasRole("EMPLOYEE")
            .antMatchers("/customer/Actions/**").hasAnyRole("ADMIN","MANAGER")
            .and()
            .formLogin()
            .loginPage("/showMyLoginForm")
            .loginProcessingUrl("/authenticateTheUser")  // it checks the 
            .permitAll()
            .and()
            .logout()
            .permitAll()
            .and().exceptionHandling().accessDeniedPage("/access-denied"); // Spring Security uses this page for Access denied pages


        }

Итак, мой вопрос, почему я должен отключить csrf для выполнения вызовов POST, но не для вызовов GET? или я что-то упустил?

1 Ответ

1 голос
/ 04 июня 2019

Краткий ответ

CSRF заботится только о действиях, которые могут манипулировать данными;для этого используются глаголы http: POST, PUT, PATCH и DELETE.Задача CSRF не защищать вас от запросов, предназначенных только для просмотра данных: GET, HEAD, OPTIONS, TRACE.

Длинный ответ

В Spring Security функция CSRF включенапо умолчанию путем реализации шаблона токена синхронизатора.Что это на самом деле означает: когда вы инициируете сеанс, вы получите токен (сгенерированный случайным образом), который нужно передавать каждый раз как X-XSRF-TOKEN (или что-то подобное) заголовок каждый раз, когда вы делаете POST, PUT,PATCH или DELETE запрос.Если токен not present или токен присутствует, но not matched для сгенерированного Spring Security, вы не можете сделать этот запрос.

Проблема, с которой вы сталкиваетесь сейчас, заключается в том, что выне передают заголовок CSRF почтальону.

Теперь возникает вопрос, действительно ли вам нужна защита CSRF?Это зависит от того, как вы храните токен аутентификации в ваших клиентах.Я бы посоветовал взглянуть на защиту CSRF, и если она не нужна, вы можете просто отключить ее.

...