web-dev-qa-db-ja.com

Spring SecurityのpermitAll()は匿名アクセスを許可していません

匿名アクセスと認証済みアクセスの両方を許可したい単一の方法があります。

Spring Security 3.2.4をJavaベースの構成で使用しています。

オーバーライドされた構成メソッド(WebSecurityConfigurerAdapterを拡張するカスタム構成クラス)には、次のhttpブロックがあります。

    http
        .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
        .addFilterBefore(cf, ChannelProcessingFilter.class)
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

Pingリクエストハンドラーとメソッドは、ログインハンドラーも含むコントローラー内にあり、問題を引き起こす可能性のある個別の@PreAuthorizeまたはその他の注釈はありません。

問題は、匿名アクセスが拒否され、ユーザーがログインページにリダイレクトされることです。

デバッグレベルでログを記録すると、Spring Securityから次のフィードバックが表示されます。

[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated]
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882, returned: -1
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point

私が達成しようとしているのは、いつでも呼び出すことができ、リクエストがログインセッション内にあるかどうかを示す応答を送信するメソッドを持つことです。

42
Zaan

アクセス許可の順序は重要です。次のように構成すると機能します。

.authorizeRequests()
        .antMatchers("/ping**")
        .permitAll()
        .and()
.authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
33
samsong8610

私は同じ問題を見ました。電話していないことを確認してください
super.configure(http);
anyRequest().authenticated();
はデフォルトで呼び出されます。

21
PeiSong

追加する必要がある。annonymous()

http
    .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
    .addFilterBefore(cf, ChannelProcessingFilter.class)
    .anonymous().and()
    .authorizeRequests().anyRequest().authenticated().and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

参照元: https://stackoverflow.com/a/25280897/256245

3
Kris