私達はちょうど私たちが持っている新しいプロジェクトのために春ブーツと春のセキュリティを使用して渡りました。問題は、当社が独自に実装したSAML認証方式でCXFを使用していることです。もちろんカスタム実装はかなり古いので、CXF 2.7。*にロックされています。我々は唯一のSOAP Webサービスを公開し、春のセキュリティを使用していなかったので、春のセキュリティとカスタムWS認証
はしばらく前に、すべてがうまく働きました。古いソリューションで使用したオーセンティケータは、org.apache.catlina.connector.Requestで認証するために何らかのJBossWebRealmを使います。
しかし、今、私たちは、認証プロバイダとしてLDAPを使用して、同様のRESTサービスを公開しようとしています。これはSpring Securityを使用した夢のように機能しますが、現在はSOAPサービスのセキュリティが失われています。これで、Spring Securityを使用してSAMへのパスワードとしてSAMLトークンを使用して認証が試行されます。
現在、我々は春ブーツが作成するデフォルトのサーブレットを持っています。これは、RESTリソースと単純なヘルスチェックWebページを公開します。 次に、SOAP Webサービスを公開するサーブレットと、メトリック(REST)を公開するサーブレットがあります。
サーブレットの設定:
@Configuration
@EnableAutoConfiguration
@Import(ApplicationConfig.class)
public class ApplicationServletInitializer extends SpringBootServletInitializer {
@Bean
public WebMvcConfigurerAdapter dispatcherServletConfigurer(final MDCInterceptor mdcInterceptor) {
return new WebMvcConfigurerAdapter() {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/internal/*");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(mdcInterceptor);
}
};
}
@Bean(name = "webServiceServlet")
public ServletRegistrationBean webServiceServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new CXFServlet());
servletRegistrationBean.setName("webServiceServlet");
servletRegistrationBean.addUrlMappings("/ws/*");
servletRegistrationBean.setLoadOnStartup(2);
return servletRegistrationBean;
}
@Bean(name = "metricsServlet")
public ServletRegistrationBean metricsServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new MetricsServlet());
servletRegistrationBean.setName("metricsServlet");
servletRegistrationBean.addUrlMappings("/internal/metrics/*");
servletRegistrationBean.setLoadOnStartup(3);
return servletRegistrationBean;
}
}
セキュリティ設定:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackageClasses = {
MDCInterceptor.class,
WebSecurityConfigurerAdapterConfig.class
})
public class RestSecurityConfig {
@Value("${ldap.url}")
private String ldapUrl;
@Value("${ldap.domain}")
private String ldapDomain;
@Bean
public ActiveDirectoryLdapAuthenticationProvider authenticationProvider() {
ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(ldapDomain, ldapUrl);
provider.setAuthoritiesMapper(authoritiesMapper());
provider.setUserDetailsContextMapper(userDetailsMapper());
provider.setUseAuthenticationRequestCredentials(true);
provider.setConvertSubErrorCodesToExceptions(true);
return provider;
}
@Bean
public MyAuthoritiesMapper authoritiesMapper() {
return new MyAuthoritiesMapper();
}
@Bean
public MyUserDetailsMapper userDetailsMapper() {
return new MyUserDetailsMapper();
}
}
@Component
public class WebSecurityConfigurerAdapterConfig extends WebSecurityConfigurerAdapter {
@Autowired
private ActiveDirectoryLdapAuthenticationProvider authenticationProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/api/**").permitAll()
.antMatchers("/api/**").hasRole("READ")
.and().httpBasic()
.and().anonymous()
.principal(anonymousPrincipal())
.authorities(anonymousRoles());
}
}
web.xmlの設定:
<security-constraint>
<web-resource-collection>
<web-resource-name>All pages</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
</security-constraint>
んこれを解決することができるかどうか誰にでも分かりますか? SOAP WebサービスのSAMLを認証する古いセキュリティフレームワークの使用を削除することは選択肢ではありません。