【问题标题】:OpenSAML custom attribute valueOpenSAML 自定义属性值
【发布时间】:2011-08-01 14:59:40
【问题描述】:

我正在尝试创建 SAML 响应。构成断言的属性之一称为地址,属性值需要是在 XSD 中定义的自定义类型。如何向响应中添加自定义属性值类型?

【问题讨论】:

    标签: java saml opensaml


    【解决方案1】:

    如果你的属性值 XML 是字符串形式:

    
    String yourXMLFragment = "...";
    
    AttributeStatementBuilder attributeStatementBuilder = 
       (AttributeStatementBuilder) builderFactory.getBuilder(AttributeStatement.DEFAULT_ELEMENT_NAME);
    AttributeStatement attributeStatement = attributeStatementBuilder.buildObject();
    
    AttributeBuilder attributeBuilder = 
       (AttributeBuilder) builderFactory.getBuilder(Attribute.DEFAULT_ELEMENT_NAME);
    Attribute attr = attributeBuilder.buildObject();
    attr.setName("yourAttributeName");
    
    XSAnyBuilder sb2 = (XSAnyBuilder) builderFactory.getBuilder(XSAny.TYPE_NAME);
    XSAny attrAny = sb2.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSAny.TYPE_NAME);
    attrAny.setTextContent(yourXMLFragment.trim());
    
    attr.getAttributeValues().add(attrAny);
    attributeStatement.getAttributes().add(attr);
    

    【讨论】:

      【解决方案2】:

      实际上,上面的结果并不正确。上面的示例只能用于创建带有文本内容而不是 xml 内容的 xsany(xml 内容被转义)。

      因此,在挖掘 opensaml 源代码后,以下确实根据需要工作:

      public XSAny createXSAny(Element dom)
      {
      XSAnyBuilder anyBuilder = (XSAnyBuilder) Configuration.getBuilderFactory().getBuilder(XSAny.TYPE_NAME);
          XSAny any = anyBuilder.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME, XSAny.TYPE_NAME);
          // this builds only the root element not the whole dom
          XSAny xo=anyBuilder.buildObject(dom);
          // set/populate dom so whole dom gets into picture
          xo.setDOM(dom);
          any.getUnknownXMLObjects().add(xo);
      
        return any; 
      }
      

      【讨论】:

        猜你喜欢
        • 2022-12-10
        • 2020-12-19
        • 2017-03-05
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多