นโยบาย LDAP

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
info

อะไร

นโยบาย LDAP มีข้อกำหนดต่อไปนี้

  • การตรวจสอบสิทธิ์: ระบบจะตรวจสอบข้อมูลเข้าสู่ระบบของผู้ใช้ที่ระบุในคำขอ กับข้อมูลเข้าสู่ระบบในผู้ให้บริการ LDAP นโยบาย LDAP ช่วยให้คุณมีความยืดหยุ่นในการตรวจสอบสิทธิ์เป็นอย่างมาก โดยให้คุณใช้ค่า DN ใดก็ได้พร้อมกับรหัสผ่าน แม้ว่าค่า DN ที่ต้องการจะไม่ได้อยู่ในคำขอก็ตาม เช่น สมมติว่าคุณต้องใช้อีเมล / รหัสผ่านเพื่อ การตรวจสอบสิทธิ์ ตัวเลือกที่เป็นไปได้มีดังนี้
    • หากมีอีเมลในคำขอ คุณก็สามารถใช้อีเมลนั้นกับรหัสผ่านสำหรับการตรวจสอบสิทธิ์ LDAP ได้เลย
    • หากไม่มีอีเมลในคำขอ แต่มีแอตทริบิวต์ DN อื่น (เช่น หมายเลขโทรศัพท์) คุณสามารถใช้หมายเลขโทรศัพท์เพื่อรับอีเมลที่เกี่ยวข้องจาก LDAP แล้วใช้อีเมล/ รหัสผ่านเพื่อตรวจสอบสิทธิ์
  • การค้นหา Distinguished Name (DN): นอกเหนือจากการตรวจสอบสิทธิ์แล้ว คุณยังใช้นโยบาย LDAP เพื่อระบุแอตทริบิวต์ของผู้ใช้ในคำขอ เช่น อีเมล และทำการค้นหาที่ดึงแอตทริบิวต์ DN อื่นๆ จาก LDAP สำหรับผู้ใช้รายนั้นได้ด้วย ระบบจะจัดเก็บ DN ที่ดึงมา ไว้ในตัวแปร

ใช้นโยบาย LDAP เมื่อควรจำกัดการเข้าถึงทรัพยากรที่ได้รับการปกป้องไว้เฉพาะผู้ใช้ในผู้ให้บริการ LDAP เช่น ผู้ใช้ที่เป็นผู้ดูแลระบบ ผู้ใช้ในองค์กร และนักพัฒนาแอป โดยเฉพาะเมื่อการเข้าถึงโทเค็น OAuth ไม่จำเป็นหรือมีน้ำหนักมากเกินไป นโยบายนี้ยังออกแบบมาเพื่อ ดึงข้อมูลเมตาของชื่อโดเมนเพื่อใช้ในโฟลว์พร็อกซี API

ตัวอย่างเช่น คุณสามารถเรียกใช้ API ได้ก็ต่อเมื่อระบบตรวจสอบสิทธิ์ผู้ใช้กับ LDAP สำเร็จแล้ว และเลือกดึงแอตทริบิวต์ DN (ชื่อโดเมน) สำหรับผู้ใช้หลังจาก การตรวจสอบสิทธิ์สำเร็จ

ดูข้อมูลเพิ่มเติมได้ที่

ตัวอย่าง

การตรวจสอบสิทธิ์ด้วยชื่อผู้ใช้/รหัสผ่าน

<Ldap name="4GLdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <UserName ref="request.header.username"/>
       <Password ref="request.header.password"/>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

ตัวอย่างนี้แสดงการตรวจสอบสิทธิ์กับผู้ให้บริการ LDAP นโยบายจะส่งชื่อผู้ใช้ และรหัสผ่านจากคำขอไปยัง LDAP เพื่อการตรวจสอบสิทธิ์

การตรวจสอบสิทธิ์แอตทริบิวต์ DN

<Ldap name="LdapPolicy">
   <LdapResource>ldap1</LdapResource>
   <Authentication>
       <Password ref="request.header.password"/>
       <SearchQuery>mail={request.header.mail}</SearchQuery>
       <Scope>subtree</Scope>
       <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
    </Authentication>
 </Ldap>

นโยบายนี้จะรับ DN ของผู้ใช้พร้อมอีเมลในส่วนหัวของคำขอ จากนั้น ตรวจสอบสิทธิ์ผู้ใช้กับ LDAP โดยใช้รหัสผ่านที่ระบุในส่วนหัวของคำขอ

การค้นหา LDAP

<Ldap name="LdapPolicy">
    <!-- using a custom LDAP provider -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
    <LdapResource>MyLdap</LdapResource>
    <Search>
        <BaseDN ref="apigee.baseDN"></BaseDN> <!-- default is dc=apigee,dc=com -->
        <SearchQuery>mail={request.header.mail}</SearchQuery>
        <Attributes>
            <Attribute>address</Attribute>
            <Attribute>phone</Attribute>
            <Attribute>title</Attribute>
        </Attributes>
        <Scope></Scope> <!-- default is subtree -->
    </Search>
</Ldap>

นโยบายนี้อ้างอิงถึงผู้ให้บริการ LDAP ที่กำหนดเอง โดยจะใช้อีเมลในส่วนหัวของคำขอ เพื่อระบุผู้ใช้ จากนั้นจะดึงข้อมูลที่อยู่ โทรศัพท์ และตำแหน่งของผู้ใช้จาก LDAP ระบบจะจัดเก็บแอตทริบิวต์ DN ที่ดึงมาไว้ในตัวแปร ดู "ตัวแปรเฉพาะนโยบาย"

หากต้องการค้นหา LDAP และดึงแอตทริบิวต์ DN คำขอต้องมีข้อมูลเข้าสู่ระบบของผู้ดูแลระบบ

การอ้างอิงองค์ประกอบ

ต่อไปนี้คือคำอธิบายขององค์ประกอบและแอตทริบิวต์ของนโยบาย LDAP

องค์ประกอบ

คำอธิบาย

Ldap

องค์ประกอบหลักที่มีแอตทริบิวต์ชื่อเพื่อให้คุณป้อนชื่อนโยบาย

LdapConnectorClass

เมื่อใช้นโยบาย LDAP กับผู้ให้บริการ LDAP ที่กำหนดเอง (ไม่ได้มาจาก Apigee) ให้ระบุคลาสตัวเชื่อมต่อ LDAP ที่มีคุณสมบัติครบถ้วน ซึ่งเป็นคลาสที่คุณใช้ExternalLdapConProvider อินเทอร์เฟซของ Apigee

LdapResource

ป้อนชื่อสภาพแวดล้อมของทรัพยากร LDAP ดูข้อมูลเพิ่มเติมได้ที่สร้าง แหล่งข้อมูล LDAP

BaseDN

ระดับฐานของ LDAP ที่มีข้อมูลทั้งหมดของคุณ เช่น ใน ผู้ให้บริการ LDAP ของ Apigee ข้อมูลทั้งหมดจะอยู่ภายใต้ dc=apigee,dc=com

  • ref: ใช้เพื่อระบุตัวแปรโฟลว์ที่มีค่า BaseDN เช่น apigee.baseDN. ref จะมีความสำคัญเหนือกว่าค่า BaseDN ที่ชัดเจน หากคุณระบุทั้ง ref และ value ref จะมีความสำคัญเหนือกว่า หาก ref ไม่ได้รับการแก้ไขที่ รันไทม์ ระบบจะใช้ value

Scope

  • object: การตรวจสอบสิทธิ์หรือการค้นหาจะเกิดขึ้นที่ระดับฐานของ LDAP เท่านั้น
  • onelevel: การตรวจสอบสิทธิ์หรือการค้นหาจะเกิดขึ้น 1 ระดับใต้ระดับฐาน
  • subtree (ค่าเริ่มต้น): การตรวจสอบสิทธิ์หรือการค้นหาจะเกิดขึ้นที่ระดับฐาน และแบบเรียกซ้ำอย่างเต็มรูปแบบที่อยู่ใต้ฐาน

การตรวจสอบสิทธิ์

Authentication

องค์ประกอบหลักสำหรับลักษณะการทำงานของการตรวจสอบสิทธิ์ที่คุณใช้

UserName

องค์ประกอบว่างที่ใช้แอตทริบิวต์ต่อไปนี้อย่างใดอย่างหนึ่ง

  • ref: การอ้างอิงถึงชื่อผู้ใช้ในคำขอ เช่น request.header.username
  • value: ชื่อผู้ใช้

หากไม่ได้ตรวจสอบสิทธิ์ด้วยชื่อผู้ใช้ หรือหากไม่ได้รวมชื่อผู้ใช้ไว้ในคำขอ คุณก็ไม่จำเป็นต้องรวมองค์ประกอบนี้

หากชื่อผู้ใช้อยู่ในคำขอ แต่คุณต้องการตรวจสอบสิทธิ์ผู้ใช้ด้วยแอตทริบิวต์ DN อื่นที่ไม่ใช่ชื่อผู้ใช้ เช่น อีเมล ให้ใส่ SearchQuery เพื่อรับอีเมลของผู้ใช้ ที่เชื่อมโยงกับรหัสผ่าน นโยบาย LDAP ใช้ชื่อผู้ใช้เพื่อค้นหาผู้ให้บริการ LDAP สำหรับอีเมลที่เกี่ยวข้อง ซึ่งจะใช้ในการตรวจสอบสิทธิ์

Password

องค์ประกอบว่างที่ใช้แอตทริบิวต์ต่อไปนี้อย่างใดอย่างหนึ่ง

  • ref: การอ้างอิงถึงรหัสผ่านในคำขอ เช่น request.header.password
  • value: รหัสผ่านที่เข้ารหัส

SearchQuery

หากต้องการตรวจสอบสิทธิ์โดยใช้แอตทริบิวต์ DN อื่นที่ไม่ใช่ชื่อผู้ใช้ เช่น อีเมล ให้กำหนดค่านโยบาย LDAP เพื่อรับแอตทริบิวต์ DN จากคำขอ (เช่น ชื่อผู้ใช้) ซึ่งใช้เพื่อระบุผู้ใช้ใน LDAP ดึงข้อมูลอีเมล และตรวจสอบสิทธิ์ ผู้ใช้

ตัวอย่างเช่น สมมติว่า LDAP กำหนดแอตทริบิวต์ "mail" สำหรับจัดเก็บอีเมล

<SearchQuery>mail={request.header.mail}</SearchQuery>

ค้นหา

Search

องค์ประกอบหลักสำหรับลักษณะการค้นหาที่คุณใช้

SearchQuery

การระบุผู้ใช้ด้วยข้อมูลเมตาในคำขอหรือการตอบกลับจะช่วยให้คุณใช้ องค์ประกอบนี้เพื่อเรียกแอตทริบิวต์ DN เพิ่มเติมสำหรับผู้ใช้จาก LDAP ได้ ตัวอย่างเช่น หากคำขอมีอีเมลของผู้ใช้ และ LDAP กำหนดแอตทริบิวต์ mail สำหรับจัดเก็บอีเมลของผู้ใช้ คุณจะต้องใช้การตั้งค่าต่อไปนี้

<SearchQuery>mail={request.header.mail}</SearchQuery>

การค้นหานี้จะค้นหาอีเมลใน LDAP ที่ตรงกับอีเมลในคำขอ และตอนนี้ นโยบายสามารถเรียกแอตทริบิวต์ DN เพิ่มเติมสำหรับผู้ใช้รายนั้นได้ด้วยองค์ประกอบ Attributes

Attributes

ใช้องค์ประกอบ <Attribute> อย่างน้อย 1 รายการเพื่อ ระบุข้อมูลเมตา DN ที่ต้องการดึงข้อมูลสำหรับผู้ใช้ ต้องระบุแอตทริบิวต์อย่างน้อย 1 รายการ

เช่น หลังจาก SearchQuery ระบุผู้ใช้แล้ว ตอนนี้ นโยบายจะเรียกแอตทริบิวต์ DN สำหรับผู้ใช้ได้ เช่น ที่อยู่ หมายเลขโทรศัพท์ และ ตำแหน่งของผู้ใช้ ดังที่แสดงในตัวอย่างต่อไปนี้

ค่าแอตทริบิวต์คือชื่อแอตทริบิวต์ DN ที่กำหนดไว้ใน LDAP

<Attributes>
  <Attribute>address</Attribute>
  <Attribute>phone</Attribute>
  <Attribute>title</Attribute>
</Attributes>

หมายเหตุการใช้งาน

Apigee Edge สำหรับ Private Cloud ช่วยให้คุณใช้ประโยชน์จากผู้ให้บริการ LDAP ในการเรียก API ได้ นโยบาย LDAP ช่วยให้แอปพลิเคชันสามารถตรวจสอบสิทธิ์เข้าถึงกับผู้ใช้ที่จัดเก็บไว้ใน LDAP และคุณสามารถ ดึงชื่อเฉพาะ (DN) จาก LDAP ซึ่งเป็นข้อมูลเมตาหรือแอตทริบิวต์ที่เชื่อมโยงกับ ผู้ใช้แต่ละราย เช่น อีเมล ที่อยู่ และหมายเลขโทรศัพท์ ระบบจะจัดเก็บ DN ที่ส่งคืนในตัวแปรเพื่อ ใช้ต่อโดยพร็อกซี API

สร้างทรัพยากร LDAP

นโยบาย LDAP ใช้ประโยชน์จากทรัพยากร LDAP ที่คุณสร้างใน Apigee Edge แหล่งข้อมูล LDAP ให้ข้อมูลการเชื่อมต่อกับที่เก็บ LDAP

หากต้องการสร้างและจัดการทรัพยากร LDAP ให้ใช้ API และเพย์โหลดต่อไปนี้

API

สร้าง (POST) ทรัพยากร LDAP หรือแสดง (GET) ทรัพยากร LDAP ทั้งหมด

/v1/organizations/org_name/environments/environment/ldapresources

ดูรายละเอียดสำหรับ (GET), อัปเดต (POST) และลบ (DELETE) ทรัพยากร LDAP

/v1/organizations/org_name/environments/environment/ldapresources/ldap_resource_name

เพย์โหลด

ต่อไปนี้คือตัวอย่างเพย์โหลด XML พร้อมความคิดเห็นเกี่ยวกับการใช้งาน

<LdapResource name="ldap1">
  <Connection>
    <Hosts>
      <!-- port is optional: defaults to 389 for ldap:// and 636 for ldaps:// -->
      <Host port="636">foo.com</Host>
    </Hosts>
    <SSLEnabled>false</SSLEnabled> <!-- optional, defaults to false -->
    <Version>3</Version> <!-- optional, defaults to 3-->
    <Authentication>simple</Authentication> <!-- optional, only simple supported -->
    <ConnectionProvider>jndi|unboundid</ConnectionProvider> <!-- required -->
    <ServerSetType>single|round robin|failover</ServerSetType> <!-- not applicable for jndi -->
    <!-- If using a custom LDAP provider, the fully qualified class: -->
    <LdapConnectorClass>com.custom.ldap.MyProvider</LdapConnectorClass>
  </Connection>
  <ConnectPool enabled="true"> <!-- enabled is optional, defaults to true -->
    <Timeout>30000</Timeout> <!-- optional, in milliseconds; if not set, no timeout -->
    <Maxsize>50</Maxsize> <!-- optional; if not set, no max connections -->
    <Prefsize>30</Prefsize> <!-- optional; if not set, no pref size -->
    <Initsize></Initsize> <!-- optional; if not set, defaults to 1 -->
    <Protocol></Protocol> <!-- optional; if not set, defaults to 'ssl plain' -->
  </ConnectPool>
  <Admin>
    <DN>cn=manager,dc=apigee,dc=com</DN>
    <Password>secret</Password>
  </Admin>
</LdapResource>

ตัวอย่าง curl: สร้างทรัพยากร LDAP

ตัวอย่างต่อไปนี้จะสร้างทรัพยากร LDAP ชื่อ ldap1

curl -X POST -H "Content-Type: application/xml" \
  https://api.enterprise.apigee.com/v1/organizations/myorg/environments/test/ldapresources \
  -u apigee_email:password -d \
  '<LdapResource name="ldap1">
    <Connection>
      <Hosts>
      <Host>foo.com</Host>
      </Hosts>
      <SSLEnabled>false</SSLEnabled>
      <Version>3</Version>
      <Authentication>simple</Authentication>
      <ConnectionProvider>unboundid</ConnectionProvider>
      <ServerSetType>round robin</ServerSetType>
    </Connection>
    <ConnectPool enabled="true">
      <Timeout>30000</Timeout>
      <Maxsize>50</Maxsize>
      <Prefsize>30</Prefsize>
      <Initsize></Initsize>
      <Protocol></Protocol>
    </ConnectPool>
    <Admin>
      <DN>cn=manager,dc=apigee,dc=com</DN>
      <Password>secret</Password>
    </Admin>
  </LdapResource>'

โค้ดตอบกลับ

ต่อไปนี้คือรหัสการตอบกลับ HTML ที่นโยบายแสดงเมื่อสำเร็จหรือล้มเหลว

  • สำเร็จ: 200
  • ไม่สำเร็จ: 401

การใช้ผู้ให้บริการ LDAP ที่กำหนดเองใน Edge สำหรับ Private Cloud

การใช้ผู้ให้บริการ LDAP ที่กำหนดเอง

Apigee Edge สำหรับ Private Cloud มาพร้อมกับผู้ให้บริการ LDAP ที่กำหนดค่าไว้แล้วเพื่อ โต้ตอบกับนโยบาย LDAP อย่างไรก็ตาม หากคุณใช้ผู้ให้บริการ LDAP ที่กำหนดเอง คุณต้องเปิดใช้ ผู้ให้บริการเพื่อรองรับนโยบาย LDAP หากต้องการทำสิ่งต่อไปนี้

  1. ในคลาสผู้ให้บริการ LDAP ให้ใช้ExternalLdapConProviderอินเทอร์เฟซ
    public interface ExternalLdapConProvider {
      void doAuthentication(LdapBean LlapBean, String userDN, String password, String baseDN);
    
      void doSearchAndAuthentication(LdapBean LlapBean, String password, String baseDN, String query, int scope);
    
      Collection<Map<String, String[]>> doSearch(LdapBean LlapBean, String query,
        String baseDN, Collection<String> requiredAttributes, int scope);
    
      void closeConnections();
    }
  2. ใน <LdapConnectorClass> ของการกำหนดค่านโยบาย (ส่วนถัดไป) ให้เพิ่มชื่อคลาสที่มีคุณสมบัติครบถ้วนของผู้ให้บริการ LDAP ที่กำหนดเอง
  3. ดาวน์โหลดไฟล์ custom-ldap.jar_.zip (คุณอาจต้องคลิกขวาแล้วเลือกบันทึกเป็น)
  4. แตกไฟล์
  5. เพิ่มไฟล์ custom-ldap.jar ลงในสภาพแวดล้อมและตรวจสอบว่าอยู่ใน classpath
  6. สร้างทรัพยากรสภาพแวดล้อมสำหรับผู้ให้บริการ LDAP คุณจะใช้ชื่อทรัพยากรสภาพแวดล้อม ในองค์ประกอบ <LdapResource> ของนโยบาย LDAP

การใช้ UnboundID LDAP SDK สำหรับ Java

คุณใช้ UnboundID LDAP SDK กับนโยบาย LDAP ได้ แต่ต้องดาวน์โหลดเวอร์ชัน 2.3.1 ก่อน แล้วเพิ่มลงในเส้นทางคลาสของ Message Processor แต่ละรายการ

วิธีใช้ UnboundID LDAP SDK กับนโยบาย LDAP

  1. เปิดเบราว์เซอร์และไปที่ที่เก็บไฟล์ Sourceforge สำหรับ UnboundID LDAP SDK
    https://sourceforge.net/projects/ldap-sdk/files/
  2. ค้นหา SDK เวอร์ชัน 2.3.1 (SE หรือ Standard Edition) แล้วดาวน์โหลดไฟล์ ZIP สำหรับเวอร์ชันนั้น เช่น ดาวน์โหลด "unboundid-ldapsdk-2.3.1-se.zip"
  3. แตกไฟล์ JAR จากไฟล์ ZIP ของ SDK ดังตัวอย่างต่อไปนี้
    unzip -j -d ~/tmp ~/Downloads/unboundid-ldapsdk-2.3.1-se.zip unboundid-ldapsdk-2.3.1-se/unboundid-ldapsdk-se.jar

    คำสั่งนี้จะแตกไฟล์ JAR ไปยังไดเรกทอรี ~/tmp เท่านั้น โดยจะวางโครงสร้างไดเรกทอรี ด้วย -j แม้ว่าจะเป็นตัวเลือกก็ตาม

  4. ในแต่ละโหนด Message Processor ให้ทำดังนี้
    1. คัดลอกไฟล์ JAR ไปยังไดเรกทอรี /opt/apigee/edge-gateway/lib/thirdparty ของ Message Processor
    2. หากจำเป็น ให้สิทธิ์ผู้ใช้ Apigee ในไฟล์ JAR เพื่อให้ Message Processor เข้าถึงได้
    3. Edge จะเพิ่มไลบรารีของบุคคลที่สามทั้งหมดในไดเรกทอรี /opt/apigee/edge-gateway/lib/thirdparty ไปยัง classpath

    4. รีสตาร์ทตัวประมวลผลข้อความโดยทำดังนี้
      /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

ตัวแปรโฟลว์

ต่อไปนี้คือตัวแปรนโยบาย LDAP ที่สร้างขึ้นโดย SearchQuery

ตัวแปร

คำอธิบาย

ldap.policyName.execution.success

หลังจากที่ดำเนินการตามนโยบายแล้ว ตัวแปรโฟลว์นี้จะมีค่าเป็น "จริง" หรือ "เท็จ" ขึ้นอยู่กับผลลัพธ์

ldap.policyName.search.result[index].
  attribute.attrName[index]=value

รูปแบบที่ยืดหยุ่นของตัวแปรนี้ โดยเฉพาะดัชนีใน บัญชีสำหรับแอตทริบิวต์หลายรายการ รวมถึงแอตทริบิวต์ที่มีค่าหลายค่า ดัชนีคือตัวเลขที่เริ่มต้นที่ 1 หากไม่ได้ระบุหมายเลขดัชนี หมายเลขดัชนีเริ่มต้นจะเป็น 1

หากนโยบายแสดงที่อยู่ หมายเลขโทรศัพท์ และอีเมล คุณจะเรียกแอตทริบิวต์แรก และค่าได้โดยใช้ตัวแปรต่อไปนี้

ldap.policyName.search.result.attribute.address
ldap.policyName.search.result.attribute.phone
ldap.policyName.search.result.attribute.email

หากต้องการดึงแอตทริบิวต์ที่อยู่รายการที่ 3 ในผลการค้นหา คุณจะต้องใช้คำสั่งนี้

ldap.policyName.search.result[3].attribute.address

หากแอตทริบิวต์มีหลายค่า (เช่น หากผู้ใช้มีอีเมลหลายรายการ) คุณจะดึงอีเมลที่ 2 จากผลลัพธ์ได้ดังนี้

ldap.policyName.search.result.attribute.mail[2]

รหัสข้อผิดพลาด

ข้อผิดพลาดที่ส่งกลับจากนโยบาย Edge จะมีรูปแบบที่สอดคล้องกันตามที่อธิบายไว้ในข้อมูลอ้างอิงรหัสข้อผิดพลาด

นโยบายนี้ใช้รหัสข้อผิดพลาดต่อไปนี้

รหัสข้อผิดพลาด ข้อความ
InvalidAttributeName Invalid attribute name {0}.
InvalidSearchBase Search base can not be empty.
InvalidValueForPassword Invalid value for password field. It can not be empty.
InvalidSearchScope Invalid scope {0}. Allowed scopes are {1}.
InvalidUserCredentials Invalid user credentials.
InvalidExternalLdapReference Invalid external ldap reference {0}.
LdapResourceNotFound Ldap resource {0} not found.
BaseDNRequired Base DN required.
OnlyReferenceOrValueIsAllowed Only value or reference is allowed for {0}.
AttributesRequired At least one attribute required for search action.
UserNameIsNull User name is null.
SearchQueryAndUserNameCannotBePresent Both search query and username can not be present in the authentication action. Please specify either one of them.