2012-03-21 18 views
1

@RolesAllowed({"Customer"})を使用してWebサービスを保護しました。私は、JerseyクライアントAPIを使用してコードとセキュリティの設定をテストしました。今、AJAXを使用してJavaScriptから同じサービスにアクセスしようとしています。 XMLHttpRequestの公開メソッドで資格情報を設定します。AjaxおよびJersey Webサービスの基本認証

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

これは単に動作しません。私に説明させてください:

XHRはまずAuthorizationヘッダーなしでリクエストを送信します。 401応答ステータスが発生した場合にのみ、要求を再試行する "WWW-Authenticate"ヘッダーが送信され、今回はAuthorizationヘッダーが送信されます。 @RolesAllowedを使用してサービスが保護されると、Jerseyは403ステータスを送信します。したがって、Authorizationヘッダーは送信されません。私は仕事にこれを取得することができ

唯一の方法は、認証は自分自身をヘッダに設定されています

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

が、これは物事の許容可能な方法は何ですか?どういうわけか、ジャージーは403の代わりに401と "WWW-Authenticate"ヘッダーを返すことができますか?

ありがとうございます!

答えて

0

希望するURLパターンのweb.xmlにauth constraintを追加すると、これを行うことができます。たとえば、次のように

<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> 

はユーザーが認証されていない場合はそれもジャージーに到達しませんその方法 - それは、あなたがするRolesAllowedFilterFactoryを拡張することができますいずれかのあなたのためのオプションではありません場合は、コンテナ自体は401

を返します。 SecurityContext.getPrincipal()がnullを返し、その場合に401を生成するかどうか、またはそれを行うContainerRequestFilterを追加するかどうかの追加チェックを行います。

関連する問題