2016-12-11 17 views
2

私はSpringのCSRFクッキーを有効化しようとしています。だから私は、次のクラスがあります。私の要求に対してCSRFクッキーが生成されないのはなぜですか?

SecurityAdapter.java

@Configuration 
@EnableWebSecurity 
public class SecurityAdapter extends WebSecurityConfigurerAdapter 
{ 
    @Override 
    protected void configure(HttpSecurity http) 
      throws Exception 
    { 
     http 
      .csrf() 
       .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 
    } 
} 

私はREST Webサービス(なしHTMLまたは何か)を実装しようとしているので、私は、サーバーへの最初の要求がすべきと考えています他のリクエストタイプにはXSRF-TOKENが必要なのでGETにしてください。それはまだありません。

私は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"); 
    } 
} 

私は(POSTメソッドでもちろん)secondメソッドを呼び出すと、私が手:

{ 
    "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" 
} 

しかし、それが呼び出されている間、私はGETでfirst方法を得るとき、私はクッキーを得ることはありませんsecondメソッドを使用して呼び出してください!

ここで何か不足していますか?

答えて

2

あなたのコードをテストしましたが、私はcsrfトークンをクッキーに入れています。私はChromeブラウザでGETメソッドを確認し、Cookieタブをチェックしました。サービスによって返されるXSRF-TOKENプレゼントがあります。サービスから返されたcsrfトークンを印刷するために、コントローラのfirstメソッドを以下のように変更しました。それをテストしてください。

@RequestMapping(value = "/first", method = RequestMethod.GET) 
public ResponseEntity get(HttpServletRequest request) 
{ 
    CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); 
    System.out.println(token.getHeaderName()+" = "+token.getToken()); 
    return ResponseEntity.ok("first"); 
} 

もう1つ。 Springブートを使用しているときは、個々のSpring Security依存関係の代わりにspring-boot-starter-securityを使用する必要があります。 pom.xmlの依存関係は以下のようになります。

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 
+0

ありがとうございました。私はクッキーを取得していましたが、何らかの理由でポストマンが表示していませんでした。私はChromeでそれをテストしました。そして、Mavenのチップに感謝します。 – Mehran

関連する問題