/support/cas-server-support-saml-idp-metadata-mongo/src/main/java/org/apereo/cas/support/saml/metadata/resolver/MongoDbSamlRegisteredServiceMetadataResolver.java

https://github.com/Jasig/cas · Java · 70 lines · 55 code · 9 blank · 6 comment · 1 complexity · b4c377c2d35b48c6998913917c9dfa25 MD5 · raw file

  1. package org.apereo.cas.support.saml.metadata.resolver;
  2. import org.apereo.cas.configuration.model.support.saml.idp.SamlIdPProperties;
  3. import org.apereo.cas.support.saml.OpenSamlConfigBean;
  4. import org.apereo.cas.support.saml.services.SamlRegisteredService;
  5. import org.apereo.cas.support.saml.services.idp.metadata.SamlMetadataDocument;
  6. import org.apereo.cas.support.saml.services.idp.metadata.cache.resolver.BaseSamlRegisteredServiceMetadataResolver;
  7. import org.apereo.cas.util.LoggingUtils;
  8. import lombok.extern.slf4j.Slf4j;
  9. import lombok.val;
  10. import net.shibboleth.utilities.java.support.resolver.CriteriaSet;
  11. import org.opensaml.saml.metadata.resolver.MetadataResolver;
  12. import org.springframework.data.mongodb.core.MongoOperations;
  13. import java.util.Collection;
  14. import java.util.Objects;
  15. import java.util.stream.Collectors;
  16. /**
  17. * This is {@link MongoDbSamlRegisteredServiceMetadataResolver}.
  18. *
  19. * @author Misagh Moayyed
  20. * @since 5.2.0
  21. */
  22. @Slf4j
  23. public class MongoDbSamlRegisteredServiceMetadataResolver extends BaseSamlRegisteredServiceMetadataResolver {
  24. private final MongoOperations mongoTemplate;
  25. private final String collectionName;
  26. public MongoDbSamlRegisteredServiceMetadataResolver(final SamlIdPProperties samlIdPProperties,
  27. final OpenSamlConfigBean configBean,
  28. final MongoOperations mongoTemplate) {
  29. super(samlIdPProperties, configBean);
  30. this.collectionName = samlIdPProperties.getMetadata().getMongo().getCollection();
  31. this.mongoTemplate = mongoTemplate;
  32. }
  33. @Override
  34. public Collection<? extends MetadataResolver> resolve(final SamlRegisteredService service, final CriteriaSet criteriaSet) {
  35. LOGGER.debug("Fetching metadata documents from collection [{}]", this.collectionName);
  36. val documents = mongoTemplate.findAll(SamlMetadataDocument.class, this.collectionName);
  37. return documents
  38. .stream()
  39. .map(doc -> buildMetadataResolverFrom(service, doc))
  40. .filter(Objects::nonNull)
  41. .collect(Collectors.toList());
  42. }
  43. @Override
  44. public boolean supports(final SamlRegisteredService service) {
  45. try {
  46. val metadataLocation = service.getMetadataLocation();
  47. return metadataLocation.trim().startsWith("mongodb://");
  48. } catch (final Exception e) {
  49. LoggingUtils.error(LOGGER, e);
  50. }
  51. return false;
  52. }
  53. @Override
  54. public void saveOrUpdate(final SamlMetadataDocument document) {
  55. this.mongoTemplate.save(document, this.collectionName);
  56. }
  57. @Override
  58. public boolean isAvailable(final SamlRegisteredService service) {
  59. return supports(service) && mongoTemplate.collectionExists(this.collectionName);
  60. }
  61. }