2016-02-29 70 views
3

我已經爲我的springframework RESTful服務配置了Springframework安全性(4.0)。對於瀏覽器啓動的GET訪問以及html表單,其中action = GET但對於其中method = requestMethod.POST的服務失敗,無論是從瀏覽器提交帶有action = POST的HTML表單;或從遠程應用程序使用RestTemplate。Springframework安全性,無法提交POST方法的HTML表單

要查看問題,我將配置簡化爲以下內容。有了這個,我可以訪問Method = GET的所有服務,而不會受到證書的挑戰(看起來是正確的),但是接收到「accessDeniedPage」的失敗(我從來沒有受到過證書的挑戰)

所有的服務都在「/ CouponController/**」:

@Override 
protected void configure (HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
    .antMatchers("/CouponController/**").permitAll() 
    .and().formLogin().permitAll() 
    .and().exceptionHandling().accessDeniedPage("/Accesses_Denied_Due_To_Security_failure"); 
} 

如果我用下面的配置,我將訪問方法的服務時的挑戰憑據= get時仍然會看到訪問方法= POST的服務時相同的行爲:

@Override 
protected void configure (HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
    .antMatchers("/CouponController/**").access("hasRole('STAFF')") 
    .and().formLogin().permitAll() 
    .and().exceptionHandling().accessDeniedPage("/Accesses_Denied_Due_To_Security_failure"); 
} 

我做錯了什麼?

回答

0

我發現我的表單提交失敗的原因。

默認情況下,spring安全啓用csrf,用於XML和Java配置。這導致我的代碼無法提交表單,因爲我提交的表單不包含csrf標記。不幸的是,當我使用Java配置時,錯誤消息只是「404請求的資源不可用」。當我切換到XML配置時,錯誤消息變得有用。

我禁用csrf後,表單提交成功。現在,我需要回去,並找出如何在我的表單中包含csrf標記。

希望這會有所幫助。

1

它失敗的原因是因爲表單中沒有CSRF令牌。

如果添加以下Spring表單標籤庫包含在您的網頁上:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 

使用溫泉<form:form>標籤在JSP,而不是一個標準的HTML <form>它會從(強烈推薦)CSRF令牌會自動添加到您的形成。

這樣做會更安全,並且是一種很好的做法,而不是禁用該功能。

另外,如果你想使用一個標準的HTML <form>您可以添加以下隱藏字段和Spring Security將處理其餘部分:

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
+0

感謝您的信息。可否請您填寫關於如何爲標準HTML添加隱藏字段的句子?由於HTML頁面是從Restful服務的服務器返回的,因此我希望看看能否讓自己遠離JSP。 – user1693207

+0

@ user1693207我已經添加了隱藏的字段示例。 – dkanejs