Я пытаюсь активировать куки CSRF весной. Таким образом, у меня есть следующий класс:Почему для моего запроса не создается cookie CSRF?
SecurityAdapter.java
@Configuration
@EnableWebSecurity
public class SecurityAdapter extends WebSecurityConfigurerAdapter
{
@Override
protected void configure(HttpSecurity http)
throws Exception
{
http
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
Поскольку я пытаюсь реализовать REST веб-сервиса (без HTML или что-нибудь), я считаю, что первый запрос на сервер должен быть GET, потому что другие типы запросов потребуют XSRF-TOKEN
, и у нас пока нет этого.
Поэтому, когда я отправляю запрос GET, я ожидаю получить куки в ответ (я был хорошим мальчиком в конце концов!). Но я не понимаю.
Вот остальные файлы проекта:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>4.1.1.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
DemoApplication.java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication
{
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Controller.Java
package com.example;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller
{
@RequestMapping(value = "/first", method = RequestMethod.GET)
public ResponseEntity get()
{
return ResponseEntity.ok("first");
}
@RequestMapping(value = "/second", method = RequestMethod.POST)
public ResponseEntity post()
{
return ResponseEntity.ok("second");
}
}
Когда я вызываю метод second
(конечно, в методе POST), я получаю:
{
"timestamp": 1481500256460,
"status": 403,
"error": "Forbidden",
"message": "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-XSRF-TOKEN'.",
"path": "/second"
}
Но когда я получаю метод first
в ГЭТ в то время как он называется, я не получаю печенье использовать и вызывать метод second
!
Что мне здесь не хватает?
Спасибо, оказалось, что я получаю cookie, но почтальон не показывает его по какой-то причине! Я тестировал его с Chrome, и он был там все время. И спасибо за совет Maven. – Mehran