3

私は、これまで実際に使用したことがない Spring Security を使用して、RESTful Web サービス (Spring MVC を使用して実装) に基本認証を追加することに取り組んでいます。今のところ、UserService後でリポジトリベースのものを追加するつもりで、インメモリを使用しているだけです。

<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:admin) へのアクセスが許可されます。

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

次のリクエストを送信すると、エラー 403 が返されます (エンコードされた文字列は guest:guest です)。

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

ただし、提供されたユーザー名が含まれていないUserServiceリクエストを送信すると、予想どおり (または少なくとも必要な場合) にエラー 403 が発生せず、代わりにユーザー名とパスワードの入力を求めるプロンプトが表示され続けます。例 (エンコードされた文字列は user:user です):

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

認識されないユーザー資格情報が提供されたときにエラー 403 で応答するために必要な追加の構成はありますか? どうすればそれを行うことができますか?

4

2 に答える 2

6

まず、

403 Forbiddenユーザーがすでに認証されているが、特定のアクションを実行する権限がない場合に使用する必要があります。あなたの例guestでは、認証に成功しましたが、彼は単なるゲストであるため、ページを表示する権限が付与されていません。

401 Unauthorizedユーザーが正常に認証されなかったことを示すために使用する必要があります。

HTTP エラー コードの詳細: http://en.wikipedia.org/wiki/HTTP_401#4xx_Client_Error

第二に、

を拡張することで、カスタム動作を指定できますBasicAuthenticationFilterprotected 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

于 2012-11-17T23:45:24.373 に答える
1

wget や curl などのクライアントでこれを試してください。401 で拒否された場合、ブラウザは Basic の再認証について何度かしつこく要求します。これはおそらくこの場合です。

于 2012-11-17T23:41:47.940 に答える