2016-06-29 40 views
4

私は春のブートで正常に動作していたアプリケーションを開発しました。安らかなコントローラがあります。私はいくつかのページに春のセキュリティを追加しようとしました。 残りコントローラのエンドポイントは、私は以下のクラスのセキュリティ設定を構成し春のセキュリティでPOST、PUT、およびDELETEメソッドを有効にする方法

/api/greetings

です。

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
      .authorizeRequests() 
       .antMatchers("/", "/home","/api/greetings").permitAll() 
       //.antMatchers("/api/greetings","").permitAll()//can't do this 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
      .logout() 
       .permitAll(); 
    } 

さて、私は残り-クライアント(ポストマン)から、残りのエンドポイントにアクセスしようとしたとき、GETメソッドのみがアクセス可能であると私はPOSTしようとした場合、私は403禁止応答を取得しています、PUTやDELETE。

{ 
    "timestamp": 1467223888525, 
    "status": 403, 
    "error": "Forbidden", 
    "message": "Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.", 
    "path": "/api/greetings/2" 
} 

この問題を解決するにはどうすればよいですか。私はSpring Securityの新機能です。

+0

私はブラウザ以外のアプリケーションなので、csrfを無効にしても問題はなく、うまくいきました。私は興味がありました。もし私がcsrfを無効にしたくないのであれば、私のアプリケーションもWebアプリケーションであれば、私はこのリンクを見つけました。しかしそれを試していないが、すぐに試してみませんか? http://stackoverflow.com/questions/27182701/how-do-i-send-spring-csrf-token-from-postman-rest-client – Rajan

答えて

3

UPDATE回答

あなたは春のセキュリティ4を使用している場合は、そうでない場合、あなたはrequireCsrfProtectionMatcher

を使用して特定のルートに/無効にCSRFを有効にすることができ、容易

http.csrf().ignoringAntMatchers("/nocsrf","/ignore/startswith/**") 

特定のルートを無効にすることができます

http.csrf().requireCsrfProtectionMatcher(new RequestMatcher() { 
    private Pattern allowedMethods = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$"); 
    private RegexRequestMatcher apiMatcher = new RegexRequestMatcher("/v[0-9]*/.*", null); 

    @Override 
    public boolean matches(HttpServletRequest request) { 
     // No CSRF due to allowedMethod 
     if(allowedMethods.matcher(request.getMethod()).matches()) 
      return false; 

     // No CSRF due to api call 
     if(apiMatcher.matches(request)) 
      return false; 

     // CSRF for everything else that is not an API call or an allowedMethod 
     return true; 
    } 
}); 

オリジナル回答

Spring SecurityでCSRF処理がデフォルトで 'on'になっているため、エラーが発生します。

http.csrf().disable();を追加して無効にすることができます。

本当に、あなたのアプリケーションは保護されていませんか?あなたのアプリケーションがフォーム提出ではなく、RESTサービスに基づいている場合でも、this articleと読んで、あなたのアプリケーションをCSRFから保護することをお勧めします。

+0

csrfを無効にすることなく他の方法がありますか? – Rajan

関連する問題