2016-05-10 7 views
0

私達はちょうど私たちが持っている新しいプロジェクトのために春ブーツと春のセキュリティを使用して渡りました。問題は、当社が独自に実装した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を認証する古いセキュリティフレームワークの使用を削除することは選択肢ではありません。

答えて

0

春のセキュリティを設定する場合 、WebSecurityConfigurerAdapterに、あなたもオーバーライドすることができます。この1以内

protected void configure(WebSecurity web). 

を、あなたは無視するかを指定することができます。 例えば:

web.ignoring().antMatchers("/ws/**"); 
関連する問題