web-dev-qa-db-ja.com

XML構成なしでカスタムAuthenticationEntryPointを定義する方法

私は今数日間苦労しています。私はSpring Bootの一種であり、XML構成を使用しないというアイデアが好きです。

RESTfullアプリケーションを作成しました(JSONを使用)。 このチュートリアル に従って、認証を適切に構成しています。

私はJava configurationを使用して、ほぼすべての構成を再現できたが、1つのことを除いて-AuthenticationEntryPoint

チュートリアルでは、このようにhttpタグのプロパティを使用し、次の方法でformLoginを定義します。

_<http entry-point-ref="restAuthenticationEntryPoint">

  <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/>

  <form-login
     authentication-success-handler-ref="mySuccessHandler"
     authentication-failure-handler-ref="myFailureHandler"
  />

  <logout />

</http>
_

Spring SecurityマニュアルAuthenticationEntryPointの説明:

AuthenticationEntryPointは、<http>要素のentry-point-ref属性を使用して設定できます。

Java Configuration。を使用してそれを行う方法については何も言及していません。

formLoginを使用しているときにログインフォームへのリダイレクトを防ぐために、XMLなしで自分のrestAuthenticationEntryPointを「登録」するにはどうすればよいですか?

以下に、私が試したことを述べます。

皆さん、ありがとうございました。


私の試みでは、次のようにbasicAuthを使用して定義できることがわかりました:

_@Configuration
@Order(1)                                                        
public static class RestWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {


        if (restAuthenticationEntryPoint == null) {
            restAuthenticationEntryPoint = new RestAuthenticationEntryPoint();
        }

        http
            .authorizeRequests()
                .antMatchers("/**").hasAnyRole(Sec.ADMIN,Sec.SUPER_USER)
...
        .and()
            .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
_

しかし、私はこのようなフォームログインを使用しています(httpBasic部分なし):

_        .and()
            .formLogin()
                .successHandler(mySavedRequestAwareAuthenticationSuccessHandler)
                .failureHandler(simpleUrlAuthenticationFailureHandler)
_

問題は、資格情報を受け取らないとログインフォームにリダイレクトされることです。これはRESTサービスなので、そうすべきではありません。

ドキュメント for FormLoginConfigurer(クラス.formLogin()使用):

作成された共有オブジェクト

次の共有オブジェクトが読み込まれます

_AuthenticationEntryPoint
_

しかし、それをオーバーライドする方法を見つけることができませんでした。
何か案は?

P.S。
ログインフォームを、エラーのみを返すカスタムフォームにオーバーライドすることはお勧めできません。

27
elysch

あなたが提供した参考文献からの引用は、http.exceptionHandling()を指しています。そこで共有エントリポイントを設定できます。

http.exceptionHandling().authenticationEntryPoint(myEntryPoint);
51
Dave Syer