【问题标题】:Spring SAML - Handling AssertionsSpring SAML - 处理断言
【发布时间】:2014-10-16 15:24:53
【问题描述】:

我们的应用程序是另一个企业应用程序(父)的一部分。我们的应用程序作为来自父 Web 应用程序的子应用程序被调用。用户在父应用程序上经过身份验证(SSO)。用户点击一个链接,我们的应用程序就会弹出。要求是我们处理 SAML 断言并使用作为断言一部分的属性。我的问题是我是否需要完整的 spring saml bean 层次结构,或者如果我只有对应于 WebSSOProfileConsumerImpl 的“webSSOprofileConsumer”就足够了

我们需要在无需担心 SSO/身份验证的情况下处理 SAML 断言。是否可以在 Spring SAML 集成中做到这一点?如果是的话怎么做。

谢谢, M

【问题讨论】:

  • 为您的问题添加更多详细信息
  • 让我尝试重新措辞。我们的应用程序在另一个企业应用程序(父)中的一部分。我们的应用程序作为来自父 Web 应用程序的子应用程序被调用。用户在父应用程序上经过身份验证(SSO)。用户点击一个链接,我们的应用程序就会弹出。要求是我们处理 SAML 断言并使用作为断言一部分的属性。我的问题是我是否需要完整的 spring saml bean 层次结构,或者如果我只有对应于 WebSSOProfileConsumerImpl 的“webSSOprofileConsumer”就足够了。
  • 请将此添加到问题中。我不是该主题的领域专家我正在审查您的问题并添加它以帮助您改进您的问题,以便获得更多视图和更快的答案

标签: spring-security saml


【解决方案1】:

不,您不需要完整的 Spring SAML bean。您只能使用 OpenSAML - 它足以解析断言和提取属性(这似乎是您似乎唯一需要的东西)。

以下代码是将带有 SAML 消息的 XML 流转换为 SAML 对象的示例:

protected T unmarshallMessage(Reader messageStream) throws MessageDecodingException {
    log.debug("Parsing message stream into DOM document");

    try {
        Document messageDoc = getPool().parse(messageStream);
        Element messageElem = messageDoc.getDocumentElement();

        if (log.isTraceEnabled()) {
            log.trace("Unmarshalled message into DOM:\n{}", XMLHelper.nodeToString(messageElem));
        }

        log.debug("Unmarshalling message DOM");
        Unmarshaller unmarshaller = Configuration.getUnmarshallerFactory().getUnmarshaller(messageElem);
        if (unmarshaller == null) {
            throw new MessageDecodingException(
                    "Unable to unmarshall message, no unmarshaller registered for message element "
                    + XMLHelper.getNodeQName(messageElem));
        }

        T message = (T) unmarshaller.unmarshall(messageElem);

        log.debug("Message successfully unmarshalled");
        return message;
    } catch (XMLParserException e) {
        log.error("Encountered error parsing message into its DOM representation", e);
        throw new MessageDecodingException("Encountered error parsing message into its DOM representation", e);
    } catch (UnmarshallingException e) {
        log.error("Encountered error unmarshalling message from its DOM representation", e);
        throw new MessageDecodingException("Encountered error unmarshalling message from its DOM representation", e);
    }
}

调用 getPool 需要返回 org.opensaml.xml.parse.ParserPool 的实例,例如BasicParserPool.

返回的对象将是例如org.opensaml.saml2.core.Responseorg.opensaml.saml2.core.Assertion 类型,您可以在 Spring SAML 的代码库中找到有关如何使用这些对象的详细信息。

参见例如SAMLCredential#getAttributeAsStringArray 了解有关属性处理的详细信息。

您在应用程序初始化期间通过调用 org.opensaml.DefaultBootstrap.bootstrap() 来初始化 OpenSAML。

【讨论】:

  • 谢谢弗拉基米尔。我们的应用程序中已经有了 spring。 1. 如果我们想使用 spring-security-saml 那么我们需要做什么。? 2. 请原谅我的无知,您提到的上述代码sn-p在哪里适合?
  • 您需要在 Maven 中包含 Spring SAML 依赖项(或手动包含所有依赖的 jar),并将 Spring SAML 示例中包含的 securityContext.xml 中的内容包含到您当前的 Spring Security 应用程序中。我发送的 sn-p 应该用在你需要解析传入的 SAML 断言的地方。
  • 谢谢弗拉基米尔。还有一个问题。在为此进行集成之前,我有一个 Spring Controller 来处理所有应用程序逻辑,并且我们没有任何身份验证。现在为了处理这个,这个控制器是否需要处理断言逻辑(进入正文)或者我需要编写一些额外的东西(例如 webSSOprofileConsumer)。使用 webSSOprofileConsumer,我不确定控制器如何从断言中获取所需的详细信息。谢谢~M
  • 我使用了 Spring 示例 securityContext,我收到以下错误 codejava.lang.IllegalArgumentException:必须在 org.opensaml.xml.security.criteria.EntityIDCriteria 提供实体 ID 条件。 setEntityID(EntityIDCriteria.java:66) at org.opensaml.xml.security.criteria.EntityIDCriteria.(EntityIDCriteria.java:46) at org.springframework.security.saml.key.JKSKeyManager.getCredential(JKSKeyManager.java: 189)
  • 当您在应用程序中使用 Spring Security 进行身份验证/授权时,您可能需要在能够正确初始化 Spring Security 上下文的类中处理令牌 - 例如通过扩展 AbstractAuthenticationProcessingFilter。您很可能使用带有少量扩展的 Spring SAML 来完成处理/验证断言和初始化 Spring Security 所需的一切,但这可能需要对扩展有更深入的了解。
猜你喜欢
  • 2016-11-06
  • 2017-07-17
  • 1970-01-01
  • 2016-01-25
  • 2015-08-19
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2015-05-12
相关资源
最近更新 更多