gpt4 book ai didi

spring-boot - 具有匿名访问权限的 Spring Boot Security PreAuthenticated 场景

转载 作者:行者123 更新时间:2023-12-02 00:37:06 28 4
gpt4 key购买 nike

我有一个 Spring Boot (1.5.6) 应用程序,它使用来自 Spring Security 的“pre-authenticated”身份验证方案 (SiteMinder)。

我需要匿名公开执行器“健康”端点,这意味着对该端点的请求不会通过 SiteMinder,因此 SM_USER header 不会出现在 HTTP 请求中 header 。

我面临的问题是,无论我如何尝试配置“健康”端点,框架都会抛出 org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException 因为当请求未通过 SiteMinder 时,预期的 header (“SM_USER”)不存在。

这是我原来的安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {

http
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests().antMatchers("/cars/**", "/dealers/**")
.hasAnyRole("CLIENT", "ADMIN")
.and()
.authorizeRequests().antMatchers("/health")
.permitAll()
.and()
.authorizeRequests().anyRequest().denyAll()
.and()
.addFilter(requestHeaderAuthenticationFilter())
.csrf().disable();
}

@Bean
public Filter requestHeaderAuthenticationFilter() throws Exception {
RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager());
return filter;
}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(preAuthProvider());
}

@Bean
public AuthenticationProvider preAuthProvider() {
PreAuthenticatedAuthenticationProvider authManager = new PreAuthenticatedAuthenticationProvider();
authManager.setPreAuthenticatedUserDetailsService(preAuthUserDetailsService());
return authManager;
}

@Bean
public AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> preAuthUserDetailsService() {
return new UserDetailsByNameServiceWrapper<>(inMemoryUserDetails());
}

@Bean
public UserDetailsService inMemoryUserDetails() {
return new InMemoryUserDetailsManager(getUserSource().getUsers());
}

@Bean
public UserHolder getUserHolder() {
return new UserHolderSpringSecurityImple();
}

@Bean
@ConfigurationProperties
public UserSource getUserSource() {
return new UserSource();
}

我曾尝试通过几种不同的方式排除/health 端点,但均无济于事。

我尝试过的事情:

为匿名访问而不是 permitAll 配置健康端点:

http
.authorizeRequests().antMatchers("/health")
.anonymous()

配置 WebSecurity 以忽略健康端点:

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

关闭所有执行器端点的安全性(不知道,但我正在抓稻草):

management.security.enabled=false

查看日志,问题似乎是 RequestHeaderAuthenticationFilter 正在注册为顶级 过滤器,而不是现有 securityFilterChain 中的过滤器:

.s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'webRequestLoggingFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestHeaderAuthenticationFilter' to: [/*]

根据我的理解,因为 RequestHeaderAuthenticationFilter 扩展了 AbstractPreAuthenticatedProcessingFilter,框架知道在链中的什么地方插入过滤器,这就是为什么我不修改 addFilter Before 或 addFilterAfter 变体。也许我应该是?有人知道明确插入过滤器的正确位置吗? (我认为在 Spring Security 的早期版本中删除了显式指定过滤器顺序的需要)

我知道我可以配置 RequestHeaderAuthenticationFilter,这样它就不会在 header 不存在时抛出异常,但如果可能的话,我希望保持启用状态。

我发现这篇 SO 帖子似乎与我的问题相似,但不幸的是那里也没有答案。 spring-boot-security-preauthentication-with-permitted-resources-still-authenti

任何帮助将不胜感激!谢谢!

最佳答案

问题确实是 RequestHeaderAuthenticationFilter 被注册为顶级过滤器(不需要)并且在 Spring Security FilterChain(需要)中。

“双重注册”的原因是因为 Spring Boot 会自动向 Servlet 容器注册任何 Filter Beans。

为了防止“自动注册”,我只需要像这样定义一个 FilterRegistrationBean:

@Bean
public FilterRegistrationBean registration(RequestHeaderAuthenticationFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration;
}

文档: https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-disable-registration-of-a-servlet-or-filter

替代/更简单的解决方案:只是不要将 RequestHeaderAuthenticationFilter 类标记为 @Bean 这很好,因为该特定过滤器不需要任何类型的 DI。通过不使用 @Bean 标记过滤器,Boot 将不会尝试自动注册它,从而无需定义 FilterRegistrationBean。

关于spring-boot - 具有匿名访问权限的 Spring Boot Security PreAuthenticated 场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036697/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com