2012-11-17 61 views
3

我正在使用Spring Security從未真正使用過的基礎認證添加到我的REST風格的Web服務(使用Spring MVC實現)中。現在,我只是簡單地使用內存中的UserService,希望稍後添加一個基於存儲庫的內存。Spring Security驗證REST風格的Web服務

<security:http> 
    <security:http-basic /> 
    <security:intercept-url pattern="/**" access="ROLE_ADMIN" /> 
</security:http> 

<security:authentication-manager> 
    <security:authentication-provider> 
     <security:user-service> 
      <security:user name="admin" password="admin" 
       authorities="ROLE_USER, ROLE_ADMIN" /> 
      <security:user name="guest" password="guest" 
       authorities="ROLE_GUEST" /> 
     </security:user-service> 
    </security:authentication-provider> 
</security:authentication-manager> 

這工作得很好,即發送以下請求授予我訪問所需的資源(其中編碼的字符串是admin:管理員):

GET /user/v1/Tyler HTTP/1.1 
Authorization: Basic YWRtaW46YWRtaW4= 

併發送下面的請求給我一個錯誤403(其中,已編碼的字符串是來賓:來賓):

GET /user/v1/Tyler HTTP/1.1 
Authorization: Basic Z3Vlc3Q6Z3Vlc3Q= 

然而,發送一個請求,其中所述提供的用戶名是不CONTAUserService中發現並沒有像我期望的那樣導致錯誤403(或者至少需要),而是繼續提示輸入用戶名和密碼。例如。 (其中,已編碼的字符串是用戶:用戶):

GET /user/v1/Tyler HTTP/1.1 
Authorization: Basic dXNlcjp1c2Vy 

有當設置未識別的用戶憑證與一個錯誤403響應需要額外的配置?我該怎麼做呢?

回答

6

首先,

403 Forbidden當用戶已經驗證,但未被授權執行特定動作應該被使用。在您的示例中,guest已成功通過身份驗證,但未被授予查看頁面的權限,因爲他只是一個訪客。

您應該使用401 Unauthorized來表明您的用戶未通過身份驗證。

更多關於HTTP錯誤代碼:http://en.wikipedia.org/wiki/HTTP_401#4xx_Client_Error

其次,

您可以通過擴展BasicAuthenticationFilter指定您的自定義行爲。 有protected void onUnsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse AuthenticationException failed)方法,你可以重寫和做任何適當的。在默認情況下,該方法爲空。

在注射自定義過濾器Spring Security的文檔:CLICK

編輯:

每次您的驗證輸入無效Spring Security中的作用:

public class BasicAuthenticationEntryPoint implements AuthenticationEntryPoint { 
... 
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) 
     throws IOException, ServletException { 

response.addHeader("WWW-Authenticate", "Basic realm=\"" + realmName + "\""); 
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException.getMessage()); 

所以,默認的行爲是正確的。用戶被髮送401並被要求提供有效的登錄/憑證。

重寫之前,請嘗試瞭解默認行爲。源代碼:CLICK

+0

謝謝,Maciej。你是對的,畢竟這是正確的行爲。很高興知道如何注入自定義過濾器。 –

1

你應該在像wget或curl這樣的客戶端上試試。如果您的401被拒絕,您的瀏覽器會爲您多次購買基本獎勵。這可能就是這種情況。

+0

我爲Mac OSX使用HTTP客戶端(與Windows的Fiddler類似)。我假定,因爲它明確地給出了一個案件的403個案件,它對另一個案件的案件也會這樣做。 –