【发布时间】:2014-09-02 00:27:45
【问题描述】:
我有一个方法,我想同时允许匿名和经过身份验证的访问。
我正在使用 Spring Security 3.2.4 和基于 Java 的配置。
覆盖的配置方法(在我扩展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
我想要完成的是有一个可以在任何时候调用的方法,它会发送一个回复,指示请求是否在登录的会话中。
【问题讨论】:
-
如果使用“/ping”或“/ping*”作为模式会发生什么?
-
你是 Luke Taylor,我在 Spring Security Javadoc cmets 中多次看到他的名字吗?如果是这样,那就太荣幸了!不幸的是,使用 /ping 和使用 /ping* 的行为是相同的。
-
你的
authorizeRequests().anyRequest().authenticated()不应该是最后一个吗?在 XML 中,元素的顺序很重要,所以我可以想象这同样适用于 java config。 -
@M.Deinum,我通过将 .authorizeRequests().antMatchers("/ping**").permitAll() 放在之前尝试了您的建议,现在它可以工作了。谢谢!
标签: java spring spring-mvc spring-security