如何使用OpenSAML2将NameId值添加到AttributeValue

时间:2018-03-02 11:59:17

标签: opensaml

使用OpenSAML2如何创建以下XML:

<saml:Attribute Name="urn:mace:dir:attribute-def:eduPersonTargetedID"
          NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri">
    <saml:AttributeValue>
        <saml:NameID Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent">c693b1c47a0da7de6518bc30a1bb8d2e44b56980</saml:NameID>
    </saml:AttributeValue>
</saml:Attribute>

1 个答案:

答案 0 :(得分:0)

扩展OpenSAML修复了这个问题,因为它似乎不支持属性值元素中的NameID值。

实现AttributeValue需要以下文件。

生成器

package com.blah;

import org.opensaml.common.impl.AbstractSAMLObjectBuilder;
import org.opensaml.common.xml.SAMLConstants;
import org.opensaml.saml2.core.AttributeValue;

public class AttributeValueBuilder extends AbstractSAMLObjectBuilder<AttributeValue>{
  public AttributeValueBuilder() {
  }

  @Override
  public AttributeValue buildObject() {
    return buildObject(SAMLConstants.SAML20_NS, AttributeValue.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX);
  }

  @Override
  public AttributeValue buildObject(String namespaceURI, String localName, String namespacePrefix) {
    return new AttributeValueImpl(namespaceURI, localName, namespacePrefix);
  }
}

实施

package com.blah;

import java.util.ArrayList;
import java.util.List;
import org.opensaml.common.impl.AbstractSAMLObject;
import org.opensaml.xml.XMLObject;

public class AttributeValueImpl extends AbstractSAMLObject implements org.opensaml.saml2.core.AttributeValue{
  protected AttributeValueImpl(String namespaceURI, String elementLocalName,
      String namespacePrefix) {
    super(namespaceURI, elementLocalName, namespacePrefix);
  }

  private List<XMLObject> children = new ArrayList<XMLObject>();

  @Override
  public List<XMLObject> getOrderedChildren() {
    return children;
  }
}

的Marshaller

package com.blah;

import org.opensaml.common.impl.AbstractSAMLObjectMarshaller;

public class AttributeValueMarshaller extends AbstractSAMLObjectMarshaller {
}

的Unmarshaller

package com.blah;

import org.opensaml.common.impl.AbstractSAMLObjectUnmarshaller;
import org.opensaml.xml.XMLObject;
import org.opensaml.xml.io.UnmarshallingException;

public class AttributeValueUnmarshaller extends AbstractSAMLObjectUnmarshaller {
  @Override
  protected void processChildElement(XMLObject parentSAMLObject, XMLObject childSAMLObject)
      throws UnmarshallingException {
    AttributeValueImpl attributeValue = (AttributeValueImpl) parentSAMLObject;
    attributeValue.getOrderedChildren().add(childSAMLObject);
  }
}

一旦包含这些文件,就需要将它们添加到OpenSAML引导配置文件saml2-assertion-config.xml(我从OpenSAML jar中复制它并将其放入Java src的根目录中):

    <!--  AttributeValue -->
    <ObjectProvider qualifiedName="saml2:AttributeValue">
        <BuilderClass className="com.blah.AttributeValueBuilder" />
        <MarshallingClass className="com.blah.AttributeValueMarshaller" />
        <UnmarshallingClass className="com.blah.AttributeValueUnmarshaller" />
    </ObjectProvider>

    <ObjectProvider qualifiedName="saml2:AttributeValueType">
        <BuilderClass className="com.blah.AttributeValueBuilder" />
        <MarshallingClass className="com.blah.AttributeValueMarshaller" />
        <UnmarshallingClass className="com.blah.AttributeValueUnmarshaller" />
    </ObjectProvider>

现在可以将任何元素添加到属性值主体。

private static XMLObject createAttributeValueNameId(String value) throws ConfigurationException {
  XMLObjectBuilder<AttributeValueImpl> attrBuilder = getSamlBuilder().getBuilder(AttributeValue.DEFAULT_ELEMENT_NAME);
  AttributeValueImpl attributeValue = attrBuilder.buildObject(AttributeValue.DEFAULT_ELEMENT_NAME);

  XMLObjectBuilder<AttributeValue> builder = getSamlBuilder().getBuilder(NameID.DEFAULT_ELEMENT_NAME);
  NameID nameId = (NameID) builder.buildObject(NameID.DEFAULT_ELEMENT_NAME);
  nameId.setFormat(NameID.UNSPECIFIED);
  nameId.setValue(value);

  attributeValue.getOrderedChildren().add(nameId);
  return attributeValue;
}