2012-03-21 101 views
1

我使用@RolesAllowed({「Customer」})保護了Web服務。我已經使用Jersey客戶端API成功測試了代碼和安全配置。現在,我正嘗試使用AJAX從JavaScript訪問相同的服務。我在XMLHttpRequest的公開方法中設置了憑據:Ajax和Jersey Web服務的基本身份驗證

xhr.open("GET", url, true, "bob", "paasss"); 

這根本不起作用。讓我解釋一下:

XHR首先發送沒有授權標頭的請求。只有當它遇到401響應狀態它重試請求的「WWW-Authenticate」標頭,並且這次發送授權標頭。當使用@RolesAllowed保護服務時,Jersey發送403狀態。因此,授權標頭永遠不會被髮送。

只有這樣我能得到這個工作組的授權頭自己:

xhr.setRequestHeader("Authorization", "Basic Ym9iOnBhc3N3MHJk"); 

這是做事的可以接受的方式?我能以某種方式讓澤西返回401而不是403以及「WWW-Authenticate」標題嗎?

謝謝!

回答

0

您可以通過在web.xml中爲所需的URL模式添加auth約束來實現。例如:

<security-constraint> 
    <display-name>Constraint1</display-name> 
    <web-resource-collection> 
     <web-resource-name>all</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
    </auth-constraint> 
</security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

這樣,它甚至不會達到澤西如果沒有用戶認證 - 容器本身會返回401

如果這不適合你,你可以擴展RolesAllowedFilterFactory一個選項對SecurityContext.getPrincipal()是否返回null進行額外檢查,並在這種情況下生成401或者只需添加ContainerRequestFilter。