타 부서에서 현재 개발하고 있는 플랫폼에서 사용자 관리 부분을 따로 관리하고 싶다고 하였다.

그 관리는 SCIM 방식으로 하길 원했고, 나는 이에 따라 SCIM API Endpoint를 제공하기로 하였다....

(서비스 오픈을 앞두고 개인적으로 좀 진행하고 있던게 있었는데 그걸 멈추고 해야 했던지라 솔직히 하기 싫었다..ㅠㅠ....)

 

 

  • SCIM
    • 클라우드 기반 애플리케이션 및 서비스에서 사용자 ID를 보다 쉽게 ​​관리할 수 있도록 설계된 것
    • 사용자 관리에 들어가는 비용과 복잡성을 줄이고자 하는 목적으로 개발되어 SCIM은 공통 사용자 스키마 및 확장 모델을 제공하고 REST API를 통해 이 스키마를 교환하기 위한 패턴을 제공하는 바인딩 문서를 제공합니다.
  • SCIM Schema Structure
    • SCIM 스키마는 많은 기존 배포 및 스키마에서 발견되는 공통 속성을 포함하는 사용자 및 그룹(리소스)을 나타내기 위한 최소 핵심 스키마를 제공합니다.
    • Resource은 하나 이상의 스키마로 식별되는 속성 모음입니다. 속성은 이름과 하나 이상의 단순 또는 복합 값으로 구성됩니다. SCIM 스키마는 속성의 데이터 유형, 복수 및 기타 구별되는 기능을 정의합니다. 달리 지정되지 않는 한 모든 속성은 소비자가 수정할 수 있습니다. 불변(읽기 전용) 속성은 속성 정의 내에서 'READ-ONLY'로 지정되어야 합니다(SHALL). 
  • Model
    • SCIM 2.0은 리소스가 공통 분모이고 모든 SCIM 개체가 리소스에서 파생되는 개체 모델을 기반으로 합니다.
    • id, externalId, meta를 속성으로 갖고 RFC7643은 공통 속성을 확장한 User, Group, EnterpriseUser를 정의한다.

  • Schema Extenstion Model
    • SCIM 스키마는 LDAP에서 사용되는 ObjectClasses와 유사한 개체 확장 모델을 따릅니다. LDAP와 달리 상속 모델이 없습니다. 모든 확장은 추가됩니다. 스키마 확장은 공통 정의된 속성을 재정의해서는 안 되며 이 사양에 정의된 규칙을 따라야 합니다(SHOULD). 각 스키마 확장은 확장을 식별하는 데 사용되는 URI를 식별해야 합니다. XML은 XML 네임스페이스를 사용해야 하고 JSON 형식은 확장 리소스와 속성을 구별하기 위해 "스키마" 속성을 사용해야 합니다(MUST).
      • LDAP : 경량 디렉터리 액세스 프로토콜은 TCP/IP 위에서 디렉터리 서비스를 조회하고 수정하는 응용 프로토콜
  • SCIM Core Schema
    • 각 SCIM 리소스(사용자, 그룹 등)에는 다음과 같은 공통 속성이 포함됩니다. 이러한 속성은 확장된 리소스 유형을 포함하여 모든 리소스에 포함되어야 합니다. 핵심 스키마가 암시적으로 포함되어 있으므로 이 문서에서 리소스가 완전히 정의된 경우 schema 속성을 지정할 필요가 없습니다. 
    • Common Schema Attributes
      • id
        • 서비스 공급자가 정의한 SCIM 리소스의 고유 식별자입니다. 리소스의 각 표현은 비어 있지 않은 id 값을 포함해야 합니다(MUST). 이 식별자는 서비스 제공자의 전체 리소스 집합에서 고유해야 합니다(MUST). id 속성의 값은 항상 서비스 제공자에 의해 발행되며 서비스 소비자에 의해 지정되어서는 안 됩니다(MUST). 
      • externalId
        • 서비스 소비자가 정의한 리소스의 식별자입니다. externalId는 소비자가 자체 식별자로 리소스를 참조할 수 있도록 하여 서비스 소비자와 서비스 제공자 간의 리소스 식별을 단순화할 수 있습니다. 공급자. 각 리소스는 비어 있지 않은 externalId 값을 포함할 수 있습니다(MAY). externalId 속성의 값은 항상 서비스 소비자로 발행되며 서비스 공급자가 지정할 수 없습니다. 
      • meta
        • 리소스 메타데이터를 포함하는 복합 속성입니다. 모든 하위 속성은 선택 사항입니다.
        • created
          • 리소스가 서비스 공급자에 추가된 DateTime입니다. 속성은 DateTime이어야 합니다. 읽기 전용.
        • lastModified
          • 이 리소스가 최초 생성 이후 수정된 적이 없는 경우 값은 생성된 값과 동일해야 합니다(MUST). 속성은 DateTime이어야 합니다. 읽기 전용.
        • location
          • 반환되는 리소스의 URI입니다. 이 값은 Location HTTP 응답 헤더와 동일해야 합니다(MUST). 읽기 전용.
        • version
          • 반환되는 리소스의 버전입니다. 이 값은 ETag HTTP 응답 헤더와 동일해야 합니다. 읽기 전용.
        • attributes
          • PATCH 작업 동안 리소스에서 제거할 속성의 이름입니다.
  • "schema" Attribute
    • SCIM은 확장 가능한 스키마와 함께 다양한 유형의 리소스를 지원합니다. 각 리소스는 정규화된 URL을 사용하여 표시되어야 합니다(MUST). 특정 표현에 스키마 표현에 대한 기존 지원이 있는 경우 해당 표현의 전통적인 규칙을 적용해야 합니다(MUST). 예를 들어 XML을 사용하여 사용자를 나타낼 때는 XML Namespace를 사용해야 합니다.
    • schemas
      • schemas 속성은 SCIM 표현에 대해 지원되는 스키마 버전과 해당 표현이 지원하는 모든 스키마 확장을 검사할 수 있는 문자열 배열입니다. 각 문자열 값은 고유한 URI여야 합니다. 이 사양은 사용자, 그룹 및 표준 "엔터프라이즈" 확장에 대한 URI를 정의합니다. SCIM 스키마의 모든 표현은 해당 표현에서 지원하는 URI 값과 함께 0이 아닌 값 배열을 포함해야 합니다(MUST). 중복 값은 포함되어서는 안 됩니다(MUST NOT). 값 순서가 지정되지 않았으며 동작에 영향을 주어서는 안 됩니다(MUST). 필수의.
  • SCIM User Schema
    • SCIM은 'urn:scim:schemas:core:1.0' URI를 사용하여 식별되는 사용자를 나타내는 스키마를 제공합니다. SCIM 핵심 스키마에 정의된 속성 외에 다음 속성이 정의됩니다.
      • userName, name, displayName, nickName, profileUrl, title, userType, preferredLanguage, locale, timezone, active, password
  • SCIM Enterprise User Schema Extension
    • 다음 SCIM 확장은 비즈니스 또는 기업에 속하거나 이를 대신하는 사용자를 나타내는 데 일반적으로 사용되는 속성을 정의합니다. 엔터프라이즈 사용자 확장은 'urn:scim:schemas:extension:enterprise:1.0' URI를 사용하여 식별됩니다.
      • employeeNumber, costCenter, organization, division, department, manager (managerId, displayName)
  • SCIM Group Schema
    • SCIM은 'urn:scim:schemas:core:1.0' URI를 사용하여 식별되는 그룹을 나타내는 스키마를 제공합니다. 그룹 리소스는 명시적인 권한 부여 모델이 정의되어 있지 않더라도 공통 그룹 또는 역할 기반 액세스 제어 모델의 표현을 가능하게 하기 위한 것입니다. 
    • SCIM 핵심 스키마에 정의된 공통 속성에 추가로 다음의 단일 속성이 정의됩니다.
      • displayName : 사람이 읽을 수 있는 그룹 이름입니다. (REQUIRED)
    • SCIM 핵심 스키마에 정의된 공통 속성 외에 다음 다중값 속성이 정의됩니다.
      • members : 그룹의 구성원 목록입니다. 표준 유형 "사용자" 및 "그룹"은 읽기 전용입니다. 값은 SCIM 리소스의 "id"(사용자 또는 그룹)여야 합니다. 그룹 유형의 의도는 서비스 공급자가 중첩된 그룹을 지원할 수 있도록 하는 것입니다.
  • Service Provider Configuration Schema
    • SCIM은 'urn: scim: schemas: core: 1.0' URI를 사용하여 식별된 서비스 제공자의 구성을 나타내는 스키마를 제공합니다.
    • 서비스 공급자 구성 리소스를 사용하면 서비스 공급자가 SCIM 사양 준수를 표준화된 형식으로 노출할 수 있을 뿐만 아니라 추가 구현 세부 정보를 소비자에게 제공할 수 있습니다. 모든 속성은 읽기 전용입니다.
    • Core Schema에 정의된 공통 속성 외에 다음의 단일 속성이 정의됩니다.
  • Resource Schema
    • 리소스 스키마는 리소스를 구성하는 속성과 메타데이터를 지정합니다. Resources 스키마는 읽기 전용이며 URI 'urn:scim:schemas:core:1.0'을 사용하여 식별됩니다. 다른 핵심 자원과 달리 Resources 스키마는 하위 속성 내에 복합 객체를 포함할 수 있으며 다른 속성이 지정되지 않는 한 모든 속성은 필수입니다.
    • Attributes로는 일단  name, description, schema, endpoint 등등이 있음

 


JSON Representation

 

Minimal User Representation

{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "2819c223-7f76-453a-919d-413861904646",
  "userName": "bjensen@example.com",
  "meta": {
    "resourceType": "User",
    "created": "2010-01-23T04:56:22Z",
    "lastModified": "2011-05-13T04:42:34Z",
    "version": "W\/\"3694e05e9dff590\"",
    "location":
     "https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646"
  }
}

 

 

Full User Representation(더보기를 클릭해서 확인하시면 됩니다)

더보기
{
  "schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
  "id": "2819c223-7f76-453a-919d-413861904646",
  "externalId": "701984",
  "userName": "bjensen@example.com",
  "name": {
    "formatted": "Ms. Barbara J Jensen, III",
    "familyName": "Jensen",
    "givenName": "Barbara",
    "middleName": "Jane",
    "honorificPrefix": "Ms.",
    "honorificSuffix": "III"
  },
  "displayName": "Babs Jensen",
  "nickName": "Babs",
  "profileUrl": "https://login.example.com/bjensen",
  "emails": [
    {
      "value": "bjensen@example.com",
      "type": "work",
      "primary": true
    },
    {
      "value": "babs@jensen.org",
      "type": "home"
    }
  ],
  "addresses": [
    {
      "type": "work",
      "streetAddress": "100 Universal City Plaza",
      "locality": "Hollywood",
      "region": "CA",
      "postalCode": "91608",
      "country": "USA",
      "formatted": "100 Universal City Plaza\nHollywood, CA 91608 USA",
      "primary": true
    },
    {
      "type": "home",
      "streetAddress": "456 Hollywood Blvd",
      "locality": "Hollywood",
      "region": "CA",
      "postalCode": "91608",
      "country": "USA",
      "formatted": "456 Hollywood Blvd\nHollywood, CA 91608 USA"
    }
  ],
  "phoneNumbers": [
    {
      "value": "555-555-5555",
      "type": "work"
    },
    {
      "value": "555-555-4444",
      "type": "mobile"
    }
  ],
  "ims": [
    {
      "value": "someaimhandle",
      "type": "aim"
    }
  ],
  "photos": [
    {
      "value":
        "https://photos.example.com/profilephoto/72930000000Ccne/F",
      "type": "photo"
    },
    {
      "value":
        "https://photos.example.com/profilephoto/72930000000Ccne/T",
      "type": "thumbnail"
    }
  ],
   "userType": "Employee",
  "title": "Tour Guide",
  "preferredLanguage": "en-US",
  "locale": "en-US",
  "timezone": "America/Los_Angeles",
  "active":true,
  "password": "t1meMa$heen",
  "groups": [
    {
      "value": "e9e30dba-f08f-4109-8486-d5c6a331660a",
      "$ref":
"https://example.com/v2/Groups/e9e30dba-f08f-4109-8486-d5c6a331660a",
      "display": "Tour Guides"
    },
    {
      "value": "fc348aa8-3835-40eb-a20b-c726e15c55b5",
      "$ref":
"https://example.com/v2/Groups/fc348aa8-3835-40eb-a20b-c726e15c55b5",
      "display": "Employees"
    },
    {
      "value": "71ddacd2-a8e7-49b8-a5db-ae50d0a5bfd7",
      "$ref":
"https://example.com/v2/Groups/71ddacd2-a8e7-49b8-a5db-ae50d0a5bfd7",
      "display": "US Employees"
    }
  ],
    "x509Certificates": [
    {
      "value":
       "MIIDQzCCAqygAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwTjELMAkGA1UEBhMCVVMx
        EzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAoMC2V4YW1wbGUuY29tMRQwEgYD
        VQQDDAtleGFtcGxlLmNvbTAeFw0xMTEwMjIwNjI0MzFaFw0xMjEwMDQwNjI0MzFa
        MH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQKDAtl
        eGFtcGxlLmNvbTEhMB8GA1UEAwwYTXMuIEJhcmJhcmEgSiBKZW5zZW4gSUlJMSIw
        IAYJKoZIhvcNAQkBFhNiamVuc2VuQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B
        AQEFAAOCAQ8AMIIBCgKCAQEA7Kr+Dcds/JQ5GwejJFcBIP682X3xpjis56AK02bc
        1FLgzdLI8auoR+cC9/Vrh5t66HkQIOdA4unHh0AaZ4xL5PhVbXIPMB5vAPKpzz5i
        PSi8xO8SL7I7SDhcBVJhqVqr3HgllEG6UClDdHO7nkLuwXq8HcISKkbT5WFTVfFZ
        zidPl8HZ7DhXkZIRtJwBweq4bvm3hM1Os7UQH05ZS6cVDgweKNwdLLrT51ikSQG3
        DYrl+ft781UQRIqxgwqCfXEuDiinPh0kkvIi5jivVu1Z9QiwlYEdRbLJ4zJQBmDr
        SGTMYn4lRc2HgHO4DqB/bnMVorHB0CC6AV1QoFK4GPe1LwIDAQABo3sweTAJBgNV
        HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
        Y2F0ZTAdBgNVHQ4EFgQU8pD0U0vsZIsaA16lL8En8bx0F/gwHwYDVR0jBBgwFoAU
        dGeKitcaF7gnzsNwDx708kqaVt0wDQYJKoZIhvcNAQEFBQADgYEAA81SsFnOdYJt
        Ng5Tcq+/ByEDrBgnusx0jloUhByPMEVkoMZ3J7j1ZgI8rAbOkNngX8+pKfTiDz1R
        C4+dx8oU6Za+4NJXUjlL5CvV6BEYb1+QAEJwitTVvxB/A67g42/vzgAtoRUeDov1
        +GFiBZ+GNF/cAYKcMtGcrs2i97ZkJMo="
    }
  ],
  "meta": {
    "resourceType": "User",
    "created": "2010-01-23T04:56:22Z",
    "lastModified": "2011-05-13T04:42:34Z",
    "version": "W\/\"a330bc54f0671c9\"",
    "location":
"https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646"
  }
}

 

 

Enterprise User Extension Representation (더보기를 클릭해서 확인하시면 됩니다)

-extension을 추가한 예시임, schemas를 보면 배열에 2개의 스키마가 정의되어 있다. 

더보기
{
  "schemas":
    ["urn:ietf:params:scim:schemas:core:2.0:User",
      "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"],
  "id": "2819c223-7f76-453a-919d-413861904646",
  "externalId": "701984",
  "userName": "bjensen@example.com",
  "name": {
    "formatted": "Ms. Barbara J Jensen, III",
    "familyName": "Jensen",
    "givenName": "Barbara",
    "middleName": "Jane",
    "honorificPrefix": "Ms.",
    "honorificSuffix": "III"
  },
  "displayName": "Babs Jensen",
  "nickName": "Babs",
  "profileUrl": "https://login.example.com/bjensen",
  "emails": [
    {
      "value": "bjensen@example.com",
      "type": "work",
      "primary": true
    },
    {
      "value": "babs@jensen.org",
      "type": "home"
    }
  ],
  "addresses": [
    {
      "streetAddress": "100 Universal City Plaza",
      "locality": "Hollywood",
      "region": "CA",
      "postalCode": "91608",
      "country": "USA",
      "formatted": "100 Universal City Plaza\nHollywood, CA 91608 USA",
      "type": "work",
      "primary": true
    },
    
    {
      "streetAddress": "456 Hollywood Blvd",
      "locality": "Hollywood",
      "region": "CA",
      "postalCode": "91608",
      "country": "USA",
      "formatted": "456 Hollywood Blvd\nHollywood, CA 91608 USA",
      "type": "home"
     }
  ],
  "phoneNumbers": [
    {
      "value": "555-555-5555",
      "type": "work"
    },
    {
      "value": "555-555-4444",
      "type": "mobile"
    }
  ],
  "ims": [
    {
      "value": "someaimhandle",
      "type": "aim"
    }
  ],
  "photos": [
    {
      "value":
        "https://photos.example.com/profilephoto/72930000000Ccne/F",
      "type": "photo"
    },
    {
      "value":
        "https://photos.example.com/profilephoto/72930000000Ccne/T",
      "type": "thumbnail"
    }
  ],
   "userType": "Employee",
  "title": "Tour Guide",
  "preferredLanguage": "en-US",
  "locale": "en-US",
  "timezone": "America/Los_Angeles",
  "active":true,
  "password": "t1meMa$heen",
  "groups": [
    {
      "value": "e9e30dba-f08f-4109-8486-d5c6a331660a",
      "$ref": "../Groups/e9e30dba-f08f-4109-8486-d5c6a331660a",
      "display": "Tour Guides"
    },
    {
      "value": "fc348aa8-3835-40eb-a20b-c726e15c55b5",
      "$ref": "../Groups/fc348aa8-3835-40eb-a20b-c726e15c55b5",
      "display": "Employees"
    },
    {
      "value": "71ddacd2-a8e7-49b8-a5db-ae50d0a5bfd7",
      "$ref": "../Groups/71ddacd2-a8e7-49b8-a5db-ae50d0a5bfd7",
      "display": "US Employees"
    }
  ],
  "x509Certificates": [
    {
      "value":
       "MIIDQzCCAqygAwIBAgICEAAwDQYJKoZIhvcNAQEFBQAwTjELMAkGA1UEBhMCVVMx
        EzARBgNVBAgMCkNhbGlmb3JuaWExFDASBgNVBAoMC2V4YW1wbGUuY29tMRQwEgYD
        VQQDDAtleGFtcGxlLmNvbTAeFw0xMTEwMjIwNjI0MzFaFw0xMjEwMDQwNjI0MzFa
        MH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQKDAtl
        eGFtcGxlLmNvbTEhMB8GA1UEAwwYTXMuIEJhcmJhcmEgSiBKZW5zZW4gSUlJMSIw
        IAYJKoZIhvcNAQkBFhNiamVuc2VuQGV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0B
        AQEFAAOCAQ8AMIIBCgKCAQEA7Kr+Dcds/JQ5GwejJFcBIP682X3xpjis56AK02bc
        1FLgzdLI8auoR+cC9/Vrh5t66HkQIOdA4unHh0AaZ4xL5PhVbXIPMB5vAPKpzz5i
        PSi8xO8SL7I7SDhcBVJhqVqr3HgllEG6UClDdHO7nkLuwXq8HcISKkbT5WFTVfFZ
        zidPl8HZ7DhXkZIRtJwBweq4bvm3hM1Os7UQH05ZS6cVDgweKNwdLLrT51ikSQG3
        DYrl+ft781UQRIqxgwqCfXEuDiinPh0kkvIi5jivVu1Z9QiwlYEdRbLJ4zJQBmDr
        SGTMYn4lRc2HgHO4DqB/bnMVorHB0CC6AV1QoFK4GPe1LwIDAQABo3sweTAJBgNV
        HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp
        Y2F0ZTAdBgNVHQ4EFgQU8pD0U0vsZIsaA16lL8En8bx0F/gwHwYDVR0jBBgwFoAU
        dGeKitcaF7gnzsNwDx708kqaVt0wDQYJKoZIhvcNAQEFBQADgYEAA81SsFnOdYJt
        Ng5Tcq+/ByEDrBgnusx0jloUhByPMEVkoMZ3J7j1ZgI8rAbOkNngX8+pKfTiDz1R
        C4+dx8oU6Za+4NJXUjlL5CvV6BEYb1+QAEJwitTVvxB/A67g42/vzgAtoRUeDov1
        +GFiBZ+GNF/cAYKcMtGcrs2i97ZkJMo="
    }
  ],
    "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
    "employeeNumber": "701984",
    "costCenter": "4130",
    "organization": "Universal Studios",
    "division": "Theme Park",
    "department": "Tour Operations",
    "manager": {
      "value": "26118915-6090-4610-87e4-49d8ca9f808d",
      "$ref": "../Users/26118915-6090-4610-87e4-49d8ca9f808d",
      "displayName": "John Smith"
    }
  },
  "meta": {
    "resourceType": "User",
    "created": "2010-01-23T04:56:22Z",
    "lastModified": "2011-05-13T04:42:34Z",
    "version": "W\/\"3694e05e9dff591\"",
    "location":
"https://example.com/v2/Users/2819c223-7f76-453a-919d-413861904646"
  }
}

 

Example User 

이것은 자바 어플리케이션 내에서 사용자 데이터를 SCIM 객체로 변환하는 방법으로 제가 사용한 코드의 예시입니다. 
@Getter
@Setter
public class ScimUser extends BaseModel {
    private String schema = "urn:ietf:params:scim:schemas:core:2.0:User";
    private UUID id;
    private String userName;
    private List<ScimEmailAttributes> emails;
    private Boolean active = false;
    private Boolean externalTestField = false;
    private String created;
    private String lastModified;

    public ScimUser(){
    }

    public ScimUser(User user){
        this.update(user);
    }

    public void update(User user) {
        this.id = UUID.nameUUIDFromBytes(user.getEmail().getBytes(StandardCharsets.UTF_8));
        this.userName = user.getUserName();
        this.active = user.isEnabled();
        this.externalTestField = user.externalTestField();
        ScimEmailAttributes attributes = new ScimEmailAttributes();
        attributes.setValue(user.getEmail());
        this.emails = Arrays.asList(attributes);
        this.created = ""; // 유저 데이터 생성 날짜 입력
        this.lastModified = ""; // 유저 데이터 수정 날짜 입력
    }


    @Override
    public Map<String, Object> toScimResource(){
        Map<String, Object> returnValue = new LinkedHashMap<>();

        ScimExternalTestDetail externalTestDetail = new ScimExternalTestDetail(); // User에서 Custom하게 추가할 필드를 위해 스키마를 추가한다.

        returnValue.put("schemas", Arrays.asList(this.schema, externalTestDetail.getSchemas()));
        returnValue.put("id", this.id);
        returnValue.put("userName", this.userName);
        returnValue.put("emails", this.emails);
        returnValue.put("active", this.active);

        // Meta information
        Map<String, Object> meta = new HashMap<>();
        meta.put("resourceType", "User");
        meta.put("location", ("scim/v1/Users"));
        meta.put("created", this.created);
        meta.put("lastModified", this.lastModified);
        returnValue.put("meta", meta);

		// Custom 필드 추가
        externalTestDetail.setExternalTestField(this.externalTestField); 
        returnValue.put(externalTestDetail.getSchemas(), externalTestDetail.toScimResource());

        return returnValue;
    }
}

 

생성

 

@Getter
@Setter
public class CreateTest {
    @JsonProperty("schemas")
    private List<String> schemas;
    @JsonProperty("userName")
    private String userName;
    @JsonProperty("emails")
    private List<ScimEmailAttributes> emails;
    @JsonProperty("urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0")
    private ExternalTestDetail extenalTestDetail;
}
 
RequestBody
{
	"schemas": [
		"urn:ietf:params:scim:schemas:core:2.0:User",
		"urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0"
	],
	"userName": "test",
	"emails": [
		{
			"value": "test@naver.com"
		}
	],
	"urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0": {
		"extenalTestDetail": false
	}
}
 

ResponseBody

{
	"schemas": [
		"urn:ietf:params:scim:schemas:core:2.0:User",
		"urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0"
	],
	"id": "7d0d8b63-ce15-36b3-b9c7-e8ca82e89b5c",
	"userName": "테스트유저",
	"emails": [
		{
			"value": "test@naver.com"
		}
	],
	"active": true,
	"meta": {
		"created": "",
		"location": "scim/v1/Users",
		"lastModified": "",
		"resourceType": "User"
	},
	"urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0": {
		"externalTestField": false
	}
}
 
검색

User 검색의 경우에는 아래와 같이 작성하였습니다.

먼저 GET 방식으로 아래의 Request URL을 받습니다.

 

https://test.com/scim/v1/Users?filter=emails[value co "test@"]

SCIM 에서 제시하는 방법에 따라 'co (consist)'를 사용하였고, email로 검색하는 경우의 예입니다. 

검색결과는 JSON으로 아래와 같이 전달합니다.

schemas 내요을 보면 ListResponse인 것을 확인하실 수 있습니다. 

 

ResponseBody

{
	"schemas": [
		"urn:ietf:params:scim:api:messages:2.0:ListResponse"
	],
	"totalResults": 1,
	"Resources": [
		{
			"schemas": [
            "urn:ietf:params:scim:schemas:core:2.0:User",
            urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0"
            ],
            "id": "7d0d8b63-ce15-36b3-b9c7-e8ca82e89b5c",
            "userName": "테스트유저",
            "emails": [
                {
                    "value": "test@naver.com"
                }
            ],
            "active": true,
            "meta": {
                "created": "",
                "location": "scim/v1/Users",
                "lastModified": "",
                "resourceType": "User"
            },
            "urn:ietf:params:scim:schemas:extension:test:ExternalTestDetail:2.0": {
                "externalTestField": false
            }
        }
    ]
}

 

패치

 

@Getter
@Setter
public class PatchTest {
    @JsonProperty("schemas")
    private List<String> schemas;
    @JsonProperty("Operations")
    private List<ScimOperations> operations;
}

Request Body

{
    "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
    "Operations": [{
        "op": "replace",
        "value": {
            "active": true
        }
    }]
}

Response Body

-유저 조회 결과와 동일

 

 

 

출처 

http://www.simplecloud.info/#Overview

http://www.simplecloud.info/specs/draft-scim-core-schema-01.html#defs

https://datatracker.ietf.org/doc/html/rfc7643#section-6

+ Recent posts