2016-09-05 26 views
1

Kerberos as recommendedによって保護されるように正常に設定されたSpring MVC RESTエンドポイントがあります。認証に成功するとすべてが動作します。問題はカスタム401エラーページになるときです。SPNEGO認証に失敗した場合のカスタムエラーページ

@Bean 
public EmbeddedServletContainerCustomizer containerCustomizer() { 
    return container -> container.addErrorPages(new ErrorPage(HttpStatus.UNAUTHORIZED, "/error/401.html")); 
} 

これは私が例えばに切り替えることにより確認することができ、うまく動作します:次のように

私は(私は春ブート1.3.5です)として、それが設定されています基本認証と間違った資格情報の提供。

ときにバックケルベロスと - 私は場所にのkinitと私のセキュアなエンドポイントにアクセスする場合、すべてが動作し、カールで、私は詳細な要求を参照してください。今、私はkdestroyを行い、カールをすれば

curl -v -u : --negotiate http://my-enpoint:8080/ 

> GET/HTTP/1.1 
> Host: ...:8080 
> User-Agent: curl/7.43.0 
> Accept: */* 

< HTTP/1.1 401 Unauthorized 
< ... 
< WWW-Authenticate: Negotiate 

> GET/HTTP/1.1 
> Host: ...:8080 
> Authorization: Negotiate YIIH7 ... 

< HTTP/1.1 200 OK 
< Server: Apache-Coyote/1.1 
< ... 

を再び:

...それだけです。この場合、スプリングは401としてと返され、ハンドシェイクの一部である応答が返されるため、エラーページは送信されません。

そして、ここに私の2つの質問が来:事は握手の途中で死ぬと

  1. は、どのように私は401エラーページを返すことができますか?

  2. は、をネゴシエートしようとしましたが、クライアントからの応答がまったくないと、フォールバック(フォーム、基本)として他の認証にフォールバックする可能性がありますか?

答えて

0

だから、戻って私の調査に...

私が観察し、この動作が期待されています。クライアント(ブラウザ、カール)は、認証できない場合、認証を続行しません。カスタムページを提供するための鍵はSpnegoEntrypointです。それはそれでforwardUrlを指定することができますし、それはjavadocが言うのです:

は、新しいSPNEGOエントリポイントをインスタンス化します。このコンストラクタを使用すると、 セキュリティコンフィグレーションでは、この種の認証をサポートしていないクライアントの場合、というフォールバックとしてログインフォームと組み合わせてSPNEGOを使用できます。

点は、第401応答に含まれる任意のリソースフォワードURL あります。フォームのログインだけでなく、任意のページを含めることができます。私のケースでは、私はカスタムフォールバックを何もしないので、カスタム401のエラーページを含んでいます。

@Bean 
public SpnegoEntryPoint spnegoEntryPoint() { 
    return new SpnegoEntryPoint("/error/401.html"); 
} 

とクライアントがGETを送信してのは、体内での私のカスタムエラーページで401応答を取り戻すように、その後の通信が見えます。クライアントがネゴシエートできる場合、クライアントは応答本体を完全に無視し、適切なトークンで要求を再サブミットします。認証できない場合は、戻ってくるものが表示されます。カスタムエラーページです。

関連する問題