Java 弹簧靴嵌入式Tomcat-Don'中的定制SAML认证阀;不适用于执行器端点
旧的共享Tomcat方法 我有一个定制的SAML2.0身份验证阀,我目前在一些独立的tomcat web服务器中使用它来实现单点登录 为了实现这一点,我们将阀门添加到tomcat服务器的context.xml中,如下所示(使用一些示例值而不是实际值): 然后,我们要求UserPrincipal中包含某些角色,以便访问应用程序。这是通过java配置再次设置的(角色从application.properties中提取): 问题 这很好——新的spring引导应用程序将任何传入请求重定向到IdP进行身份验证,然后IdP将SAML响应发回最初请求的URL,页面按预期加载 问题是,我们启用了需要绕过该身份验证的spring引导执行器端点。具体而言,我们需要将健康检查端点Java 弹簧靴嵌入式Tomcat-Don'中的定制SAML认证阀;不适用于执行器端点,java,spring-boot,tomcat,saml-2.0,tomcat-valve,Java,Spring Boot,Tomcat,Saml 2.0,Tomcat Valve,旧的共享Tomcat方法 我有一个定制的SAML2.0身份验证阀,我目前在一些独立的tomcat web服务器中使用它来实现单点登录 为了实现这一点,我们将阀门添加到tomcat服务器的context.xml中,如下所示(使用一些示例值而不是实际值): 然后,我们要求UserPrincipal中包含某些角色,以便访问应用程序。这是通过java配置再次设置的(角色从application.properties中提取): 问题 这很好——新的spring引导应用程序将任何传入请求重定向到IdP进行身
/exactor/health
设置为不安全的,以便将其用作kubernetes的准备就绪探针
我无法确定在每个请求路径基础上应用该ServletSecurity
的方法,因此我们不需要对/exactor/*
路径的任何请求进行任何身份验证
这样做可能吗?找到了一个非常简单的解决方案 如果将
management.server.port
属性更改为与运行主应用程序上下文的端口不同的端口,spring boot将自动为启动器端点创建子应用程序上下文
这样,我添加的ServletSecurity
只应用于默认的父应用程序上下文,在另一个端口上运行的执行器端点不需要身份验证
<Context>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<Valve className="example.CustomIdpValve"
idp="default" issuerName="SAMLIssuer"
idpUrl="https://example.idp.com/sso/"
certificatePath="${catalina.base}/conf/idp.cer"
/>
</Context>
@Bean
public ConfigurableServletWebServerFactory embeddedServletContainerCustomizer() {
final CustomIdpValve customIdpValve = new CustomIdpValve();
final Valve singleSignOnValve = new SingleSignOn();
final TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addContextValves(customIdpValve);
factory.addContextValves(singleSignOnValve);
return factory;
}
@Component
public class WebAppInitializer implements ServletContextInitializer {
private final String[] roles;
public WebAppInitializer(@Value("${tomcat.embedded.roles}") final String[] roles) {
this.roles = roles;
}
public void onStartup(final ServletContext container) {
final ServletRegistration.Dynamic servlet = (ServletRegistration.Dynamic) container.getServletRegistration("default");
servlet.setServletSecurity(new ServletSecurityElement(new HttpConstraintElement(ServletSecurity.TransportGuarantee.NONE, roles)));
servlet.setServletSecurity(new ServletSecurityElement(new HttpConstraintElement(ServletSecurity.TransportGuarantee.CONFIDENTIAL, roles)));
}
}