0

在 SCIM 核心模式中,定义了一个简单的多值属性“photos”来保存用户照片的 url。

在 UnboundID 数据存储配置目录中,scim-resources.xml 文件在用户资源下注释掉了以下内容:

<!-- 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>

如果在某处记录了如何执行此操作,我无法找到它。

任何指导表示赞赏。

授予

4

2 回答 2

1

由于 SCIM 照片属性指的是照片的外部 URL 数组,因此您可以创建一个 Data Store 虚拟属性,该属性在 SCIM 中映射到引用托管 servlet 以检索照片的 URL 数组。没有用于从 ldap 条目返回 jpegPhoto 属性的现有服务器端点,并且您说过您不希望通过 SCIM 获得 base64 编码的二进制数据。

理想情况下,返回照片的 HTTP Servlet 扩展将接受与 SCIM 用户相同的凭据进行身份验证,并作为 SCIM 用户执行 LDAP 搜索,该用户将尊重 jpegPhoto 属性的 ACI 访问控制,例如

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 支持可能会有所帮助。

于 2015-08-29T13:44:55.107 回答
0

作为起点,我编写了一个简单的 servlet,通过针对 uid 的 LDAP 查询将 jpegPhoto(如果存在)的第一个值作为图像/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\""
        }
    }]
}
于 2015-09-09T01:21:23.747 回答