我有一种方法可以允许匿名和经过身份验证的访问。
我正在使用基于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请求处理程序和方法位于一个控制器中,该控制器也包含登录处理程序,它没有单独的@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
我想要完成的是拥有一个可以随时调用的方法,该方法将发送一个回复,指示请求是否在登录会话中。
答案 0 :(得分:27)
权限顺序非常重要,当我按照以下方式配置时,它会起作用:
.authorizeRequests()
.antMatchers("/ping**")
.permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
答案 1 :(得分:21)
我看到了同样的问题。确保你没有打电话给
super.configure(http);
anyRequest().authenticated();
默认调用。
答案 2 :(得分: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");
答案 3 :(得分:0)
@Override
public void configure(HttpSecurity http) throws Exception {
http.anonymous().and()...;
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().mvcMatchers("/ping**");
}
答案 4 :(得分:0)
我为此问题苦苦挣扎了一天。最后我必须做的是从我的过滤器中删除 @Component
注释,并手动实例化它,如 this 答案中所述。
所以对于最初的问题,这看起来像:
http
.addFilterBefore(new MultiPartFilter(), ChannelProcessingFilter.class)
.addFilterBefore(new OtherFilter(), ChannelProcessingFilter.class)
.authorizeRequests() // ... rest omitted for brevity
我还必须通过覆盖 configure(WebSecurity web)
来从 Spring Security 中完全删除这些端点,如 J. Perez 的回答中所述:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/ping**");
}