gpt4 book ai didi

java - Spring Saml FilterChainProxy 清除上下文 - null 身份验证

转载 作者:行者123 更新时间:2023-12-02 03:21:43 25 4
gpt4 key购买 nike

我遇到与 Spring Saml2 相关的 Spring Security 配置问题,这会导致即使 IDP 成功响应,身份验证也始终为空

我将 spring-security-saml2-core1.0.2.RELEASEspring 4.3 结合使用。 0.RELEASEspring-security 4.1.0.RELEASE

我有一个简单的 SP,它通过 SSOCircle 通过 SSO 进行身份验证。身份验证工作和调试我可以看到 SAMLAuthenticationProvider 返回经过身份验证的用户,并具有我期望的授予权限。到目前为止一切顺利。

尽管身份验证完成后,我进入了 org.springframework.security.web.FilterChainProxy:180 调用以下行

SecurityContextHolder.clearContext();

我怀疑这是我之后身份验证为空的原因。

以下是 Spring Security 配置:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

...

@Bean
public SAMLAuthenticationProvider samlAuthenticationProvider() {
SAMLAuthenticationProvider samlAuthenticationProvider = new SAMLAuthenticationProvider();
samlAuthenticationProvider.setUserDetails(samlUserMappingService);
samlAuthenticationProvider.setForcePrincipalAsString(false);
return samlAuthenticationProvider;
}

@Bean
public FilterChainProxy samlFilter() throws Exception {
List<SecurityFilterChain> chains = new ArrayList<SecurityFilterChain>();

chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/login/**"), samlEntryPoint()));
chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/logout/**"), samlLogoutFilter()));
chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/metadata/**"),
metadataDisplayFilter()));
chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSO/**"),
samlWebSSOProcessingFilter()));
chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SSOHoK/**"),
samlWebSSOHoKProcessingFilter()));
chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/SingleLogout/**"),
samlLogoutProcessingFilter()));
chains.add(new DefaultSecurityFilterChain(new AntPathRequestMatcher("/saml/discovery/**"), samlIDPDiscovery()));
return new FilterChainProxy(chains);
}



@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic().authenticationEntryPoint(samlEntryPoint());
http.csrf().disable();
//http.addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class)
http.addFilterAfter(samlFilter(), BasicAuthenticationFilter.class);
http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/error").permitAll().antMatchers("/saml/**")
.permitAll().anyRequest().authenticated();
http.logout().logoutSuccessUrl("/");
}


@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(samlAuthenticationProvider()).eraseCredentials(false);

...
}

这是 Web 初始化程序:

public class WebInitialiser extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {};
}

@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}

@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { WebMvcConfig.class};
}

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addFilter("samlFilter", new DelegatingFilterProxy("samlFilter"))
.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*");

super.onStartup(servletContext);
}

}

附注有关额外信息:我主要引用了 github 上以下存储库中的代码:https://github.com/vdenotaris/spring-boot-security-saml-sample/tree/master/src/main/java/com/vdenotaris/spring/boot/security/saml/web但我没有使用 Spring boot。

应用程序部署在apache-tomcat-8.0.30上,我也尝试了apache-tomcat-7.0.37。

最佳答案

我已经找到答案了。初始化上下文时,过滤器未正确注册,因此出现上述奇怪的行为。

解决方案是创建一个类,如下

public class SecurityInitialiser extends SecurityWebApplicationInitializer(){}

并从 WebInitialiser 类中删除 onStartup 方法。

这在 Spring boot 中起作用的原因是因为过滤器是自动扫描和注册的。

关于java - Spring Saml FilterChainProxy 清除上下文 - null 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39513688/

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