2014-09-24 4 views
2

우리는 SP로 스프링 SAML 확장을 응용 프로그램에 사용할 계획입니다. 그러나 우리의 응용 프로그램과 요구 사항은 우리가 하나가/나 제공은 여러 IDP의이다중 IDP 용 스프링 SAML 확장

가 나는 또한 스프링 SAML 확장을 알고 싶습니다

무엇을 지원 사용하는 예에 저를 직접시겠습니까 이상 1 IDP의 와 통신 할 필요가있다 OPenAM/핑 같은 IDPS의 종류 당신은 Spring SAML manual에서 질문에 대한 모든 답을 찾을 수 있습니다 ... ADFs2.0 등/ --Vikas

답변

0

감사를 연합.

제품의 일부로 포함 된 샘플 응용 프로그램에는 이미 metadata for two IDPs이 포함되어 있으며이를 예로 사용합니다.

ID 공급자 모드에서 SAML 2.0을 지원하는 모든 제품 (예 : ADFS를 2.0, 표어는, OpenAM/OpenSSO, Efecte 신원 또는 핑 연합)을 사용할 수 있습니다 :

는 실향민에 대한 문은 장 1.2에 포함되어 있습니다 확장자.

2

각 Idp의 메타 데이터 목록을 유지 관리하는 클래스가 있어야합니다. 일부 메타 테이블을 정적 메서드로 응용 프로그램간에 공유 할 수 있습니다. 나는 내가 데 있다는 것입니다 나는 모든 클래스를 복사하고 있지 않다 참고 - 아래 같은 것을, 그래서

public class SSOMetadataProvider { 
    public static List<MetadataProvider> metadataList() throws MetadataProviderException, XMLParserException, IOException, Exception {    
      logger.info("Starting : Loading Metadata Data for all SSO enabled companies..."); 
      List<MetadataProvider> metadataList = new ArrayList<MetadataProvider>(); 
      org.opensaml.xml.parse.StaticBasicParserPool parserPool = new org.opensaml.xml.parse.StaticBasicParserPool(); 
      parserPool.initialize(); 

      //Get XML from DB -> convertIntoInputStream -> pass below as const argument 
      InputStreamMetadataProvider inputStreamMetadata = null; 
      try { 
     //Getting list from DB 
       List companyList = someServiceClass.getAllSSOEnabledCompanyDTO(); 

       if(companyList!=null){ 
        for (Object obj : companyList) { 
         CompanyDTO companyDTO = (CompanyDTO) obj; 
         if (companyDTO != null && companyDTO.getCompanyid() > 0 && companyDTO.getSsoSettingsDTO()!=null && !StringUtil.isNullOrEmpty(companyDTO.getSsoSettingsDTO().getSsoMetadataXml())) { 
          logger.info("Loading Metadata for Company : "+companyDTO.getCompanyname()+" , companyId : "+companyDTO.getCompanyid()); 

          inputStreamMetadata = new InputStreamMetadataProvider(companyDTO.getSsoSettingsDTO().getSsoMetadataXml()); 
          inputStreamMetadata.setParserPool(parserPool); 
          inputStreamMetadata.initialize(); 


          //ExtendedMetadataDelegateWrapper extMetadaDel = new ExtendedMetadataDelegateWrapper(inputStreamMetadata , new org.springframework.security.saml.metadata.ExtendedMetadata()); 

          SSOMetadataDelegate extMetadaDel = new SSOMetadataDelegate(inputStreamMetadata , new org.springframework.security.saml.metadata.ExtendedMetadata()) ; 

          extMetadaDel.initialize(); 
          extMetadaDel.setTrustFiltersInitialized(true); 
          metadataList.add(extMetadaDel); 

          logger.info("Loading Metadata bla bla"); 


         } 
        } 
       } 

      } catch (MetadataProviderException | IOException | XMLParserException mpe){ 

       logger.warn(mpe); 
       throw mpe; 
      } 
      catch (Exception e) { 
       logger.warn(e); 
      } 

      logger.info("Finished : Loading Metadata Data for all SSO enabled companies..."); 

      return metadataList; 
     } 

InputStreamMetadataProvider.java

, 당신이 스스로 해결할 수 있어야 사소한 문제를 건너 왔어요 수
public class InputStreamMetadataProvider extends AbstractReloadingMetadataProvider implements Serializable 
    { 
    public InputStreamMetadataProvider(String metadata) throws MetadataProviderException 
     { 
      super(); 
      //metadataInputStream = metadata; 
      metadataInputStream = SSOUtil.getIdpAsStream(metadata); 

     } 
@Override 
    protected byte[] fetchMetadata() throws MetadataProviderException 
    { 
     byte[] metadataBytes = metadataInputStream ; 

     if(metadataBytes.length>0) 
       return metadataBytes; 
     else 
      return null; 
    } 
public byte[] getMetadataInputStream() { 
    return metadataInputStream; 
} 
} 

SSOUtil.java

public class SSOUtil { 

    public static byte[] getIdpAsStream(String metadatXml) { 


      return metadatXml.getBytes(); 


     } 

} 

사용자 요청은, 자신의 회사의 메타 데이터에 대한 메타 데이터를 가져 오는 각 실향민에 대한 ENTITYID에 대한 메타 데이터를 얻을 후 -,SSOCachingMetadataManager.java

public class SSOCachingMetadataManager extends CachingMetadataManager{ 

@Override 
    public ExtendedMetadata getExtendedMetadata(String entityID) throws MetadataProviderException { 
     ExtendedMetadata extendedMetadata = null; 

     try { 


      //UAT Defect Fix - org.springframework.security.saml.metadata.ExtendedMetadataDelegate cannot be cast to biz.bsite.direct.spring.app.sso.ExtendedMetadataDelegate 
      //List<MetadataProvider> metadataList = (List<MetadataProvider>) GenericCache.getInstance().getCachedObject("ssoMetadataList", List.class.getClassLoader()); 

      List<MetadataProvider> metadataList = SSOMetadataProvider.metadataList(); 

      log.info("Retrieved Metadata List from Cassendra Cache size is :"+ (metadataList!=null ? metadataList.size(): 0)); 

      org.opensaml.xml.parse.StaticBasicParserPool parserPool = new org.opensaml.xml.parse.StaticBasicParserPool(); 
      parserPool.initialize(); 

      if(metadataList!=null){ 



       //metadataList.addAll(getAvailableProviders()); 
       //metadataList.addAll(getProviders()); 

       //To remove duplicate entries from list, if any 
       Set<MetadataProvider> hs = new HashSet<MetadataProvider>(); 
       hs.addAll(metadataList); 

       metadataList.clear(); 
       metadataList.addAll(hs); 
       //setAllProviders(metadataList); 
       //setTrustFilterInitializedToTrue(); 
       //refreshMetadata(); 

      } 


      if(metadataList!=null && metadataList.size()>0) { 

       for(MetadataProvider metadataProvider : metadataList){ 


         log.info("metadataProvider instance of ExtendedMetadataDelegate: Looking for entityId"+entityID); 

         SSOMetadataDelegate ssoMetadataDelegate = null;      
         ExtendedMetadataDelegateWrapper extMetadaDel = null; 

//      extMetadaDel.getDelegate() 
         if(metadataProvider instanceof SSOMetadataDelegate) 
          {ssoMetadataDelegate = (SSOMetadataDelegate) metadataProvider; 

           ((InputStreamMetadataProvider)ssoMetadataDelegate.getDelegate()).setParserPool(parserPool); 
           ((InputStreamMetadataProvider)ssoMetadataDelegate.getDelegate()).initialize(); 
           ssoMetadataDelegate.initialize(); 

           ssoMetadataDelegate.setTrustFiltersInitialized(true); 

           if(!isMetadataAlreadyExist(ssoMetadataDelegate)) 
            addMetadataProvider(ssoMetadataDelegate); 

           extMetadaDel = new ExtendedMetadataDelegateWrapper(ssoMetadataDelegate.getDelegate() , new org.springframework.security.saml.metadata.ExtendedMetadata()); 
          } 
         else 
          extMetadaDel = new ExtendedMetadataDelegateWrapper(metadataProvider, new org.springframework.security.saml.metadata.ExtendedMetadata()); 


         extMetadaDel.initialize(); 
         extMetadaDel.setTrustFiltersInitialized(true); 

         extMetadaDel.initialize(); 

         refreshMetadata(); 

         extendedMetadata = extMetadaDel.getExtendedMetadata(entityID); 

       } 
     } 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     if(extendedMetadata!=null) 
      return extendedMetadata; 
     else{ 
      return super.getExtendedMetadata(entityID);       
     } 
    } 



    private boolean isMetadataAlreadyExist(SSOMetadataDelegate ssoMetadataDelegate) { 

     boolean isExist = false; 
      for(ExtendedMetadataDelegate item : getAvailableProviders()){ 

        if (item.getDelegate() != null && item.getDelegate() instanceof SSOMetadataDelegate) { 

         SSOMetadataDelegate that = (SSOMetadataDelegate) item.getDelegate(); 
         try { 

          log.info("This Entity ID: "+ssoMetadataDelegate.getMetadata()!=null ? ((EntityDescriptorImpl)ssoMetadataDelegate.getMetadata()).getEntityID() : "nullEntity"+ 

            "That Entity ID: "+that.getMetadata()!=null ? ((EntityDescriptorImpl)that.getMetadata()).getEntityID() : "nullEntity"); 

          EntityDescriptorImpl e = (EntityDescriptorImpl) that.getMetadata(); 

         isExist = this.getMetadata()!=null ? ((EntityDescriptorImpl)ssoMetadataDelegate.getMetadata()).getEntityID().equals(e.getEntityID()) : false; 

          if(isExist) 
           return isExist; 
         } catch (MetadataProviderException e1) { 
          // TODO Auto-generated catch block 
          e1.printStackTrace(); 
         } 

       } 

      } 
      return isExist; 

    } 

통해 UR 스프링 빈 XML의 항목을

<bean id="metadata" class="pkg.path.SSOCachingMetadataManager"> 
     <constructor-arg name="providers" value="#{ssoMetadataProvider.metadataList()}"> 
     </constructor-arg> 
     <property name="RefreshCheckInterval" value="-1"/> 
     <property name="RefreshRequired" value="false"/> 
</bean> 

이 날 우려의 넣다 알려 추가합니다.

관련 문제