首页 文章

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

提问于
浏览
39

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

我正在使用基于 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");

ping 请求处理程序和方法位于一个控制器中,该控制器也包含登录处理程序,它没有可能导致问题的 separate_1_or 其他注释。

问题是匿名访问被拒绝,用户被重定向到登录页面。

记录调试级别,我看到 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

我想要完成的是拥有一个可以随时调用的方法,它将发送一个回复,指示请求是否在 logged-in 会话中。

3 回答

  • 31

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

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

    我看到了同样的问题。确保你没有打电话
    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");
    

    参考自:https://stackoverflow.com/a/25280897/256245

相关问题