2016-01-14 9 views
15

मैं स्प्रिंग सिक्योरिटी एसएएमएल एक्सटेंशन का उपयोग कर स्प्रिंग सिक्योरिटी के साथ एसएएमएल एसएसओ को एकीकृत करने की कोशिश कर रहा हूं। इससे पहले, मैं यहां मिली अवधारणा का सबूत चलाने में सफल रहा: https://github.com/vdenotaris/spring-boot-security-saml-sample। दुर्भाग्यवश, कॉन्फ़िगरेशन को मेरे प्रोजेक्ट में ले जाने के बाद यह सही तरीके से काम नहीं कर रहा है।स्प्रिंग सिक्योरिटी एसएएमएल प्लगइन - कोई होस्टेड सेवा प्रदाता कॉन्फ़िगर नहीं किया गया है

लॉग का विश्लेषण करने के बाद, मुझे पता चला कि मेरा एप्लिकेशन (एसपी) प्रदान किए गए यूआरएल से आईडीपी मेटाडेटा को सही ढंग से डाउनलोड कर रहा है। हालांकि, ब्राउज़र में https://localhost:8443/saml/metadata कोशिश कर रहा द्वारा की मेरी सपा मेटाडाटा डाउनलोड करने के लिए कोशिश कर के बाद, निम्नलिखित अपवाद फेंक दिया जाता है:

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 

डिबगिंग के बाद, मैं यह पता लगाने की क्यों स्प्रिंग की इकाई आईडी यह पता लगाने में सक्षम नहीं है में सक्षम नहीं था मेरा आवेदन। मैं इसे इस तरह स्थापित कर रहा हूं:

// 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 फ़िल्टर से पहले है। मुझे यकीन नहीं है कि यह प्रासंगिक है - मुझे नहीं लगता - लेकिन मेरा आवेदन स्प्रिंग बूट का उपयोग नहीं कर रहा है - और नमूना अनुप्रयोग (कॉन्फ़िगरेशन का स्रोत) है।

किसी भी मदद के लिए अग्रिम धन्यवाद।

+0

क्या आपने url का उपयोग करने का प्रयास किया है: https: // localhost: 8443/<अनुप्रयोग संदर्भ रूट>/saml/मेटाडेटा मेटाडेटा डाउनलोड करने के लिए ब्राउज़र में? आप जिस यूआरएल को आजमा रहे हैं उसका आवेदन नाम नहीं है। –

+0

मुझे लगता है कि यूआरएल सही है - यदि नहीं, 500 स्थिति कोड के बजाय 404 स्टेटस कोड होगा और कोई अपवाद नहीं होगा। –

+0

एसएसओ के लिए वसंत-सैम-एक्सटेंशन का उपयोग करते समय मुझे यह त्रुटि भी मिल रही थी। क्या आप कृपया मुझे saml का मूल्य बता सकते हैं।इकाई-आईडी प्रॉपर्टी –

उत्तर

7

मैं इस सप्ताह मुद्दा मिल गया। फिल्टर के साथ एक समस्या थी। तरीकों में से एक 'samlFilter' बनाने की थी, इस तरह:

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) 
     .addFilterAfter(samlFilter(), BasicAuthenticationFilter.class); 
    http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/error").permitAll() 
     .antMatchers("/saml/**").permitAll().anyRequest().authenticated(); 
    http.logout().logoutSuccessUrl("/"); 
} 

कि पूरी तरह से सही था। हालांकि, जब मैं जेटी सर्वर का उपयोग कर एप्लिकेशन लॉन्च कर रहा था, तो मैं एप्लिकेशन संदर्भ में केवल 'samlFilter' को जोड़ने की कोशिश कर रहा था। उस वजह से, 'मेटाडाटा जेनरेटरफिल्टर' से पहले 'मेटाडाटा डिस्प्लेफ़िल्टर' फ़िल्टर श्रृंखला में नहीं जोड़ा गया था। जब मैंने 'samlFilter' को 'springSecurityFilter' में बदल दिया, तो सब कुछ काम करना शुरू कर दिया। जेटी के मेरे गैर मानक उपयोग के कारण, यह खोजना आसान नहीं था।

आपकी मदद के लिए धन्यवाद!

+0

"जब मैंने 'samlFilter' को 'springSecurityFilter' में बदल दिया, तो सबकुछ काम करना शुरू कर दिया।" क्या आप इसके लिए कोड नमूना दे सकते हैं? क्या आपका मतलब है कि आपने सुरक्षा Context.xml में स्प्रिंग आईओसी रेफरी जोड़ा है? मुझे web.xml springSecurityFilterChain tom

+0

में परिभाषित सर्वलेट के अलावा कोई भी "springSecurityFilter" नहीं मिल रहा है, मैं इसी तरह के मुद्दे पर फंस गया हूं। क्या आप एक कोड नमूना साझा कर सकते हैं या विस्तार कर सकते हैं "springSecurityFilter के लिए samlFilter बदल रहा है"? – theLearner

1

क्या आपके पास एक आईडीपी कॉन्फ़िगर किया गया है?

+0

मुझे लगता है कि आपके आईडीपी – Ruddy

+0

में saml.entity-id के साथ कोई प्रविष्टि नहीं है मेरा आईडीपी वेब इंटरफ़ेस के माध्यम से कॉन्फ़िगर किया गया है और यह ठीक से काम कर रहा है जब मैं इसे किसी अन्य एप्लिकेशन से उपयोग करना। समस्या एसपी पक्ष पर है, और मैं इसके बारे में 100% निश्चित हूं। मेरा एसपी भी लॉग पर आधारित आईडीपी मेटाडाटा को सही ढंग से डाउनलोड कर रहा है। –

1

मेटाडाटा जेनरेटर इकाई में एक साझा कुंजी है जिसका उपयोग आप अपने आईडीपी से संवाद करने के लिए करते हैं कि आपका एप्लिकेशन इसे एक्सेस करना चाहता है। आईडीपी पक्ष पर एक नमूना कॉन्फ़िगरेशन है जहां आपको आईडीपी उपयोगकर्ताओं तक पहुंचने के लिए अपने एप्लिकेशन को सक्षम करने के लिए एक ही इकाई आईडी दर्ज करना होगा।

<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

दुर्भाग्य से यह मुद्दा नहीं है। मेरा आईडीपी वेब इंटरफेस के माध्यम से कॉन्फ़िगर किया गया है और जब मैं इसे किसी अन्य एप्लिकेशन से उपयोग कर रहा हूं तो यह अच्छी तरह से काम कर रहा है। समस्या एसपी पक्ष पर है, और मैं इसके बारे में 100% निश्चित हूं। मेरा एसपी भी लॉग पर आधारित आईडीपी मेटाडाटा को सही ढंग से डाउनलोड कर रहा है। –

संबंधित मुद्दे