2016-01-14 8 views
15

SAML SSOとSpring Security SAML拡張を使用してSpring Securityを統合しようとしています。以前は、ここに見つかった概念証明を実行するのに成功しました:https://github.com/vdenotaris/spring-boot-security-saml-sample。残念ながら、設定をプロジェクトに移動した後、正しく動作しません。Spring Security SAMLプラグイン - ホストされているサービスプロバイダが例外を設定していません

ログを分析した後、私のアプリケーション(SP)が提供されたURLからIdPメタデータを正しくダウンロードしていることが分かりました。しかし、ブラウザでhttps://localhost:8443/saml/metadataを試みることによって私のSPのメタデータをダウンロードしようとした後、次の例外がスローされます。

javax.servlet.ServletException: Error initializing metadata 
at org.springframework.security.saml.metadata.MetadataDisplayFilter.processMetadataDisplay(MetadataDisplayFilter.java:120) 
at org.springframework.security.saml.metadata.MetadataDisplayFilter.doFilter(MetadataDisplayFilter.java:88) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:213) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1645) 
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:564) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:578) 
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:221) 
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1111) 
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:498) 
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:183) 
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1045) 
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:98) 
at org.eclipse.jetty.server.Server.handle(Server.java:461) 
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:284) 
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:244) 
at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:534) 
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:607) 
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:536) 
at java.lang.Thread.run(Thread.java:745) 
Caused by: org.opensaml.saml2.metadata.provider.MetadataProviderException: No hosted service provider is configured and no alias was selected 
    at org.springframework.security.saml.context.SAMLContextProviderImpl.populateLocalEntity(SAMLContextProviderImpl.java:311) 
    at org.springframework.security.saml.context.SAMLContextProviderImpl.populateLocalContext(SAMLContextProviderImpl.java:216) 
    at org.springframework.security.saml.context.SAMLContextProviderImpl.getLocalEntity(SAMLContextProviderImpl.java:107) 
    at org.springframework.security.saml.metadata.MetadataDisplayFilter.processMetadataDisplay(MetadataDisplayFilter.java:114) 
    ... 24 more 

デバッグした後、春はのエンティティIDを把握することができない理由を、私は把握することができませんでした私のアプリケーション。私はこのように設定しています:

// Filter automatically generates default SP metadata 
@Bean 
public MetadataGenerator metadataGenerator() { 
    MetadataGenerator metadataGenerator = new MetadataGenerator(); 
    metadataGenerator.setEntityId(environment.getRequiredProperty("saml.entity-id")); 
    metadataGenerator.setEntityBaseURL("URL is here"); 
    metadataGenerator.setExtendedMetadata(extendedMetadata()); 
    metadataGenerator.setIncludeDiscoveryExtension(false); 
    metadataGenerator.setKeyManager(keyManager()); 
    return metadataGenerator; 
} 

もちろん、設定からsaml.entity-idプロパティーが正しくダウンロードされています。セキュリティ設定全体:https://gist.github.com/mc-suchecki/671ecb4d5ae4bae17f81

メタデータジェネレータフィルタはSAMLフィルタの前にあります。私はそれが適切であるかどうかはわかりませんが、私のアプリケーションはSpring Bootを使用していません。サンプルアプリケーション(設定のソース)はです。

ご協力いただきありがとうございます。

+0

ブラウザでurl:https:// localhost:8443//saml/metadataを使用してメタデータをダウンロードしようとしましたか?試しているURLにはアプリケーション名がまったくありません。 –

+0

私はURLが正しいと思います。そうでなければ、500のステータスコードの代わりに404のステータスコードがあり、例外もありません。 –

+0

SSO用にspring-saml-extensionを使用しているときにもこのエラーが発生していました。あなたはsamlの価値を教えてくれますか?entity-idプロパティ –

答えて

7

私は今週、問題を発見しました。フィルタに問題がありました。方法の一つは、「samlFilter」を作成し、次のように:完全に正しかった

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

:その後

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); 
} 

、別の方法がそうように、春のための全体のフィルタチェーンを設定しました。しかし、私がJettyサーバーを使ってアプリケーションを起動するとき、私はアプリケーションコンテキストに 'samlFilter'だけを接続しようとしていました。そのため、 'metadatageneratorFilter'はであり、となる前にの前にフィルタチェーンにまったく追加されませんでした。 'samlFilter'を 'springSecurityFilter'に変更すると、すべてが機能し始めました。 Jettyの私の非標準的な使用のために、それは見つけるのは容易ではありませんでした。

ありがとうございました!

+0

"'samlFilter'を 'springSecurityFilter'に変更すると、すべてが動作するようになりました。" securityContext.xmlにSpring IOC Refを追加したことを意味しますか? web.xmlに定義されたサーブレット以外の "springSecurityFilter"が見つかりません。 springSecurityFilterChain tom

+0

私は同様の問題を抱えています。コードサンプルを共有したり、 "samlFilterをspringSecurityFilterに変更する"ことを具体化できますか? – theLearner

1

IDPが設定されていますか?

+0

あなたのIDPにsaml.entity-idのエントリがないと思います – Ruddy

+0

私のIDPはウェブインタフェースを介して設定されています。別のアプリケーションからそれを使用します。問題はSP側であり、私はそれについて100%確信しています。私のSPは、ログに基づいてIDPメタデータも正しくダウンロードしています。 –

1

MetadataGeneratorのentityIdは、アプリケーションがアクセスしたいIDPと通信するために使用する共有キーです。 IDP側には、アプリケーションがIDPユーザーにアクセスできるようにするために同じエンティティIDを入力する必要があるsamlConfigurationがあります。

<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter"> 
<constructor-arg> 
    <bean class="org.springframework.security.saml.metadata.MetadataGenerator">    
     <property name="entityId" value="****"/> 
     <property name="extendedMetadata"> 
      <bean class="org.springframework.security.saml.web.MyExtendedMetadata"> 
       <property name="signMetadata" value="true"/>       
       <property name="signingKey" value="****"/> 
       <property name="encryptionKey" value="****"/> 
      </bean> 
     </property> 
    </bean> 
</constructor-arg> 

+0

それは残念ながら問題ではありません。私のIDPはウェブインターフェースを介して設定されており、別のアプリケーションから使用しているときにうまく機能しています。問題はSP側であり、私はそれについて100%確信しています。私のSPは、ログに基づいてIDPメタデータも正しくダウンロードしています。 –

関連する問題