我想禁用安全链中的 Spring Security 过滤器之一。
我已经看到了防止 Spring Boot 注册 servlet 过滤器 https://stackoverflow.com/questions/28421966/prevent-spring-boot-from-registering-a-servlet-filter问题 - 并接受应该有效,但不幸的是无效。
附代码:
@Bean
public FilterRegistrationBean registration(AnonymousAuthenticationFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}
Spring Boot 会立即宣布没有符合资格的 bean,这令人悲伤:
引起原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到依赖项 [org.springframework.security.web.authentication.AnonymousAuthenticationFilter] 类型的合格 bean:预计至少有 1 个有资格作为此依赖项的自动装配候选者的 bean。依赖注释:{}
创建另一个 bean 后:
@SuppressWarnings("deprecation") // Oh, there be dragons
@Bean
public AnonymousAuthenticationFilter anonymousAuthenticationFilter() {
return new AnonymousAuthenticationFilter();
}
我受到攻击
引起原因:java.lang.IllegalArgumentException:[断言失败] - 此字符串参数必须有长度;它不能为 null 或为空
这是完全不稳定的;Assert
s in afterPropertiesSet()
method https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authentication/AnonymousAuthenticationFilter.java https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security/web/authentication/AnonymousAuthenticationFilter.java阻止我使用默认构造函数。使用另一种方法:
@Bean
public AnonymousAuthenticationFilter anonymousAuthenticationFilter() {
// it will be disabled anyway so...
return new AnonymousAuthenticationFilter("_", new Object(), new ArrayList<GrantedAuthority>());
}
一切都变得更好了:
INFO 4916 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean:过滤器anonymousAuthenticationFilter未注册(已禁用)
DEBUG 4916 --- [ost-startStop-1] o.s.security.web.FilterChainProxy:初始化过滤器“springSecurityFilterChain”
DEBUG 4916 --- [ost-startStop-1] o.s.security.web.FilterChainProxy:过滤器“springSecurityFilterChain”配置成功
但在访问一些资源后我得到:
DEBUG 4916 --- [nio-8080-exec-3] o.s.security.web.FilterChainProxy :/user 位于附加过滤器链中 13 个位置中的第 10 个位置;触发过滤器:'AnonymousAuthenticationFilter'
DEBUG 4916 --- [nio-8080-exec-3] o.s.s.w.a.AnonymousAuthenticationFilter :使用匿名令牌填充 SecurityContextHolder:'org.springframework.security.authentication.AnonymousAuthenticationToken@90572420:主体:anonymousUser;凭证:[受保护];已验证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@255f8:RemoteIpAddress:127.0.0.1;会话 ID:6B9D974A4634548750FE78C18F62A6B0;授予权限:ROLE_ANONYMOUS'
由于某种原因 AnonymousAuthenticationFilter 仍在工作。
问题:有没有办法在 Spring Boot 应用程序中禁用此类过滤器?