在UnboundID中通过SCIM返回用户照片网址

时间:2015-08-27 05:09:28

标签: ldap photo endpoints scim

在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属性的用户条目。问题:

  1. UnboundID是否已定义端点以访问这些端点 相片?我不想只是编码的二进制字符串值jpegPhoto
  2. 如果存在这样的端点(或者我创建了一个端点),那么我是否需要编写转换类并在<subMapping>元素的<canonicalValue>子元素中引用它?
  3. 如果如何做到这一点,我无法找到它。

    任何指导意见。

    捐赠

2 个答案:

答案 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\""
        }
    }]
}