Подтвердить что ты не робот

Spring Разрешение безопасности All(), не позволяющее анонимному доступу

У меня есть единственный метод, который я хочу разрешить как анонимный, так и аутентифицированный доступ.

Я использую Spring Security 3.2.4 с настройкой на основе java.

Переопределенный метод configure (в моем настраиваемом классе конфигурации, расширяющий 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 Безопасность:

[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.sprin[email protected]6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]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.sp[email protected]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

Я пытаюсь выполнить метод, который можно вызвать в любой момент и который отправит ответ, указывающий, находится ли запрос внутри сеанса входа в систему.

4b9b3361

Ответ 1

Порядок разрешений важен, он работает, когда я настраиваю его следующим образом:

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

Ответ 2

Я видел ту же проблему. Убедитесь, что вы не вызывали

super.configure(http); anyRequest().authenticated(); вызывается по умолчанию.

Ответ 3

Необходимо добавить .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");

Рефералы: fooobar.com/info/311281/...