在SCIM核心架构中,有一个简单的多值属性“照片”,用于保存用户照片的网址。
在UnboundID Data Store配置目录中,scim-resources.xml文件在User资源下有以下注释:
<!-- Mapping must be defined to use this attribute
<attribute name="photos" schema="urn:scim:schemas:core:1.0"
readOnly="false" required="false">
<description>URL of photos of the User</description>
<simpleMultiValued childName="photo" dataType="string">
<canonicalValue name="photo"/>
<canonicalValue name="thumbnail"/>
</simpleMultiValued>
</attribute>
-->
规范中的下方是一个示例输出:
"photos": [
{
"value": "https://photos.example.com/profilephoto/72930000000Ccne/F",
"type": "photo"
},
{
"value": "https://photos.example.com/profilephoto/72930000000Ccne/T",
"type": "thumbnail"
}
],
我有填充了jpegPhoto属性的用户条目。问题:
<subMapping>
元素的<canonicalValue>
子元素中引用它?如果如何做到这一点,我无法找到它。
任何指导意见。
捐赠
答案 0 :(得分:1)
由于SCIM照片属性是指照片的外部URL数组,因此您可以创建一个数据存储虚拟属性,该属性在SCIM中映射到引用托管servlet以检索照片的URL数组。没有现有的服务器端点用于从ldap条目返回jpegPhoto属性,并且您已经说过您不希望通过SCIM获得base64编码的二进制数据。
返回照片的HTTP Servlet扩展理想情况下接受与SCIM用户相同的凭据进行身份验证,并执行LDAP搜索,作为将尊重jpegPhoto属性的ACI访问控制的SCIM用户,例如
GET https://server:8443/photosEndpoint/{entryUUID}[/attribute-option]
Authorization: <scim user credentials>
由于jpegPhoto是一个多值属性,如果有一个(或第一个,如果有多个)jpegPhoto属性,则可以返回img / jpeg内容类型实体。您似乎尝试使用限定符从多张照片中进行选择,例如: / F全尺寸?和/ T用于缩略图但没有办法在没有属性选项的情况下在LDAP中分辨多值属性值,例如,
jpegPhoto returned via /photosEndpoint/{entryUUID}
jpegPhoto;size=fullsize returned via /photosEndpoint/{entryUUID}[/fullsize | /F]
jpegPhoto;size=thumbnail returned via /photosEndpoint/{entryUUID}[/thumbnail | /T]
还可以编写servlet来处理多张照片,方法是将它们返回到多部分MIME响应中,每个部分使用jpegPhoto。部件名称将包括属性选项(如果可用)。一个缺点是这种响应无法在浏览器中轻松呈现。
总的来说,这是一个很好的想法,但在实践中有一些工作量。 UnboundID支持可能会有所帮助。
答案 1 :(得分:0)
作为一个起点,我编写了一个简单的servlet,通过针对uid的LDAP查询将jpegPhoto的第一个值(如果存在)作为image / png返回。然后我写了一个简单的转换类,根据uid返回相关的照片URL:
import com.unboundid.asn1.ASN1OctetString;
import com.unboundid.scim.schema.AttributeDescriptor;
import com.unboundid.scim.sdk.SCIMAttributeValue;
import com.unboundid.util.ByteString;
public class PhotoTransform extends com.unboundid.scim.ldap.Transformation {
@Override
public String toLDAPFilterValue(String scimFilterValue) {
// TODO Auto-generated method stub
return null;
}
@Override
public ASN1OctetString toLDAPValue(AttributeDescriptor descriptor, SCIMAttributeValue value) {
// TODO Auto-generated method stub
return null;
}
@Override
public SCIMAttributeValue toSCIMValue(AttributeDescriptor descriptor, ByteString value) {
return SCIMAttributeValue.createStringValue("http://localhost:4567/photo/" + value.stringValue());
}
然后我引用了SCIM resources.xml中的类,将uid作为LDAP属性传递:
<attribute name="photos" schema="urn:scim:schemas:core:1.0"
readOnly="false" required="false">
<description>URL of photos of the User</description>
<simpleMultiValued childName="photo" dataType="string">
<canonicalValue name="photoUrl">
<subMapping name="value" ldapAttribute="uid"
transform="com.example.scim.PhotoTransform">
</subMapping>
</canonicalValue>
<canonicalValue name="thumbnail"/>
</simpleMultiValued>
</attribute>
和SCIM查询(针对参考实现)
curl 'http://localhost:8080/Users?filter=userName%20eq%20%22jsmith%22' -u bjensen:password
现在返回:
{
"totalResults" : 1,
"itemsPerPage" : 1,
"startIndex" : 1,
"schemas" : ["urn:scim:schemas:core:1.0", "urn:scim:schemas:extension:enterprise:1.0"],
"Resources" : [{
"name" : {
"formatted" : "Mr. John Smith",
"familyName" : "Smith",
"givenName" : "John"
},
"phoneNumbers" : [{
"value" : "tel:555-555-1256",
"type" : "work"
}
],
"userName" : "jsmith",
"emails" : [{
"value" : "jsmith@example.com",
"type" : "work"
}
],
"photos" : [{
"value" : "http://localhost:4567/photo/jsmith",
"type" : "photoUrl"
}
],
"id" : "fb4134dc-0a93-476a-964a-c29847f3bf79",
"meta" : {
"created" : "2015-09-09T00:17:12.768Z",
"lastModified" : "2015-09-09T00:17:12.768Z",
"location" : "http://localhost:8080/v1/Users/fb4134dc-0a93-476a-964a-c29847f3bf79",
"version" : "\"20150909001712.768Z\""
}
}]
}