Spring Security permitAll()不允许匿名访问
我有一个方法,我想允许匿名和经过身份validation的访问。
我正在使用基于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
我想要完成的是拥有一个可以在任何时候调用的方法,它将发送一个回复,指示请求是否在登录会话中。
权限顺序很重要,当我像这样配置它时它会起作用:
.authorizeRequests() .antMatchers("/ping**") .permitAll() .and() .authorizeRequests() .anyRequest() .authenticated() .and()
我看到了同样的问题。 确保你没有打电话
super.configure(http);
anyRequest().authenticated();
默认情况下调用。
需要添加.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
- 可以用ColdFusion中的“常规”字符串操作逻辑替换java.lang.StringBuffer吗?
- javax.security.cert.X509Certificate vs java.security.cert.X509Certificate?
- 云是否已为企业Java Web应用程序做好准备? 寻求Java EE托管建议
- 您如何减少Java日志记录样板代码?
- Lombok在大型项目中减慢了构建过程
- Spring Boot CORSfilter – CORS预检频道没有成功
- 生产者 – Java中的消费者multithreading
- 禁用PDFBox上的日志记录
- 为什么使用Collections.sort的程序仅对32或更大的列表失败?