Spring Security permitAll 不允许匿名访问

我有一个单独的方法,我希望同时允许匿名和经过身份验证的访问。

我使用的是 SpringSecurity3.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 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

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

133875 次浏览

我看到了同样的问题。确保你没有打电话
super.configure(http);
anyRequest().authenticated();
默认情况下调用。

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

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

需要添加 。匿名()

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

@Override
public void configure(HttpSecurity http) throws Exception {
http.anonymous().and()...;
}


@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().mvcMatchers("/ping**");
}

这个问题困扰了我一整天。最后我必须做的是从我的过滤器中删除 @Component注释,并手动实例化它,如 这个答案中所述。

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

http
.addFilterBefore(new MultiPartFilter(), ChannelProcessingFilter.class)
.addFilterBefore(new OtherFilter(), ChannelProcessingFilter.class)
.authorizeRequests() // ... rest omitted for brevity

我还不得不通过覆盖 configure(WebSecurity web)来将这些端点从春季安全系统中完全移除,正如 J. Perez 的回答所描述的:

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

由于我正在设置空白令牌 API 请求,我不得不把它从角度中移除

if (token) {
newHeaders = newHeaders.append('Authorization', 'Bearer' + ' ' + token);
}

这里的令牌是空的

请确保课堂上有 @Configuration的注释

我无法发送到一个 permitAll () url。之后,我发现原因是启用了 CSRF。所以我通过以下方式关闭了它:

http.....and().csrf().disable();

附注: 禁用它不是一个好主意,我将不得不弄清楚如何发布与 CSRF 在未来。