春季安全许可证全部不允许匿名访问

2022-08-31 13:40:28

我有一个单一的方法,我想允许匿名和经过身份验证的访问。

我正在使用Spring Security 3.2.4和基于Java的配置。

被覆盖的配置方法(在我的自定义配置类扩展中)具有以下块:WebSecurityConfigurerAdapterhttp

    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

我试图实现的是拥有一个可以在任何时候调用的方法,该方法将发送回复,指示请求是否在登录会话中。


答案 1

权限顺序很重要,当我像这样配置它时,它的工作原理是:

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

答案 2

我看到了同样的问题。确保您没有在默认情况下调用呼叫


super.configure(http);anyRequest().authenticated();


推荐