Spring Security permitAll()不允许匿名访问

Mar*_*eau 48 java spring spring-mvc spring-security

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

我正在使用基于java的配置的Spring Security 3.2.4.

重写的配置方法(在我的自定义配置类中扩展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");
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我想要完成的是拥有一个可以在任何时候调用的方法,它将发送一个回复,指示请求是否在登录会话中.

sam*_*610 37

权限顺序很重要,当我像这样配置时,它可以工作:

.authorizeRequests()
        .antMatchers("/ping**")
        .permitAll()
        .and()
.authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
Run Code Online (Sandbox Code Playgroud)


Pei*_*ong 23

我看到了同样的问题.确保
super.configure(http);
anyRequest().authenticated();
默认情况下不调用.

  • 我不能赞成这一点.我已经尝试过多次放弃Spring,因为我永远无法让Spring Security工作; 这一直是这个原因.非常感谢! (4认同)

小智 14

需要添加.anonymous()

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");
Run Code Online (Sandbox Code Playgroud)

引用自:https : //stackoverflow.com/a/25280897/256245

  • 哦,我多么希望这个能发挥作用。我得到:嵌套异常是 java.lang.IllegalStateException:无法在任何请求后配置 antMatchers。springBootVersion = '2.3.3.RELEASE' (2认同)

joh*_*aug 5

我为这个问题苦苦挣扎了一天。我最终要做的就是@Component从过滤器中删除注释,并手动实例化它,如答案中所述。

因此,对于最初的问题,这看起来像:

http
    .addFilterBefore(new MultiPartFilter(), ChannelProcessingFilter.class)
    .addFilterBefore(new OtherFilter(), ChannelProcessingFilter.class)
    .authorizeRequests() // ... rest omitted for brevity
Run Code Online (Sandbox Code Playgroud)

我还必须configure(WebSecurity web)按照 J. Perez 的回答中所述进行覆盖,从 Spring Security 中完全删除这些端点:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/ping**");
}
Run Code Online (Sandbox Code Playgroud)


sn1*_*87a 5

我无法发布到 PermitAll() url。之后我发现原因是由于启用了CSRF。所以我通过以下方式禁用它:

http.....and().csrf().disable();
Run Code Online (Sandbox Code Playgroud)

PS:禁用它不是一个好主意,我将来必须弄清楚如何使用 CSRF 进行 POST。