การเขียนโปรแกรมภาษา PHP เชื่อมต่อกับ LDAP SERVER(1)

สมมุติว่าทุกๆท่านรู้จัก LDAP แล้วนะครับ

ก่อนอื่น สมมุติว่าทุกๆท่านรู้จัก LDAP Server กันแล้วนะครับว่าคืออะไร ใช้ยังไง

ตอนแรกต้องทดสอบก่อนว่า Server เราสามารถใช้ LDAP extension ได้ไหม

วิธีทดสอบมี 3 วิธีคือ

1. สร้างแฟ้มสำหรับแสดงรายละเอียดของ php สมมุติชื่อ phpinfo.php

phpinfo();

สร้างเสร็จแล้ว ก้เรียกใช้ ผ่าน Browser อะไรก็ได้ มองหาตารางคล้ายๆกับตารางนี้

ldap
LDAP Support enabled
RCS Version $Id: ldap.c,v 1.154.2.7 2005/07/09 01:00:11 sniper Exp $
Total Links 0/unlimited
API Version 2004
Vendor Name OpenLDAP
Vendor Version 20129

ถ้าสามารถหาเจอ และตรง LDAP Support เขียนว่า enabled ก็แปลว่า Server คุณสามารถใช้ ldap ได้

2. สร้างแฟ้มสำหรับเรียกใชโดยตรง เช่น test1.php

ldap_connect(‘localhost’);

ถ้ามันขึ้นแบบนี้

Fatal error: Call to undefined function: ldap_connect () in /XXXX/i.php on line 2

ก็แปลว่าเครื่องคุณไม่สามารถใช้ ldap ได้

3. สร้างแฟ้มสำหรับทดสอบ function โดยเฉพาะ เช่น test_function.php

alert('สามารถใช้ Function $function ได้');

$function=$_POST["function"];
if($function){
  if(function_exists($function)){
   echo"Funtion นี้ใช้ได้
"
;
  }else{
   echo"Funtion นี้ใช้ไม่ได้
"
;
  }
}

 

คราวนี้สมมุติว่าเครื่องคุณใช้ ldap ไม่ได้ ก็ต้องคอมไพล์ php กันใหม่ครับ ให้ใช้ –with-ldap ด้วยนะครับ

คราวนี้สมมุติว่าเครื่องคุณใช้ ldap ได้

ขั้นตอนมันก็ไม่มีอะไรมาก

จะสามารถแบ่งได้ 3 ขั้นตอนคือ (อันนี้ผมแบ่งเองนะครับ)

1. ติดต่อกับ LDAP Server

ตอนแรกก็ติดต่อกับ LDAP Server ก่อนนะครับ

$ds=ldap_connect(‘localhost’,’389’)

ตรง localhost ให้เปลี่ยนเป็น ip หรือชื่อเครื่อง Server ถ้า LAP Server เป็นเครื่องอื่น และ port ปกติ

ของ LDAP คือ 389 ครับ ตรงนี้ไม่ต้องใสก็ได้ ก็เป็น

ldap_connect(‘localhost’)

หลังจากติดต่อได้แล้วก็ต้องแสดงว่าใครคือผู้ติดต่อโดยใช้คำสั่งนี้ครับ

ldapbind = ldap_bind($ds, $binddn, $password);

ส่วนนี้อาจจะพูดได้ว่าเป็นการ Login หรือการ ตรวจสอบการ Login ก็ได้ครับ ซึ่งผมเองได้เขียน

Function สำหรับการตรวจสอบ Login ดังตัวอย่างครับ

function ldap_login($ds,$username,$password,$ou,$suffix){
    $i=
0;
    while(
1){
        $binddn = "uid=$username,ou=".$ou[$i].",".$suffix;
        @$ldapbind = ldap_bind($ds, $binddn, $password);
        if ($ldapbind){
            return true;
            break;
        }else{
            if($i==
3){
                ldap_close($ds);
                return false;
                break;
            }
        }
        $i++;
   }
}

เวลาจะใช้ก็

$ou = array("student","staff","unistaff");
$suffix_string = "dc=psu,dc=pn";
if(ldap_login($ds,$USER,$PASSWORD,$ou,$suffix_string)){
    echo”
สวัสดีครับ”;
}else{
    echo”User
หรือ Password ผิด”;
}

2. การทำงาน คราวนี้คุณจะทำอะไรก็ได้แล้วแต่คุณนะครับ

แต่ที่ผมจะแนะนำก็มี 4 อย่าง คือ การ เพิ่ม การ ลบ การแก้ไข และการค้นหา User

2.1 การ เพิ่ม User ใช้คำสั่ง ldap_add ครับ ดังตัวอย่าง

$info["cn"]=”Mr.Patt Emmawat”;
$info["sn"]=Patt;
$info["ou"]="student";
$info["mail"]=s
4145217@remove.mor-or.pn.psu.ac.th";
$info["objectclass"][
0]="top";
$info["objectclass"][
1]="person";
$info["objectclass"][
2]="inetOrgPerson";
$info["objectclass"][
3]="organizationalPerson";
$info["objectclass"][
4]="posixAccount";
$info["objectclass"][
5]="shadowAccount";
$info["uidNumber"]=
1000;// ใน linux คือ uid หรือ หมายเลขประจำตัวของ user
$info["uid"]=”s
4145217”;// คือ ส่วนของ User Name
$info["gidNumber"]="
1000"; // ใน linux คือ gid หรือ หมายเลขประจำตัวของ group
$info["homeDirectory"]="/home/s
4145217;
$info["loginShell"]="/bin/sh";
$pwd=md
5(“s4145217”);
info["userPassword"]=$pwd[rand(
0,31)].$pwd[rand(0,31)].$pwd[rand(0,31)].$pwd[rand(0,31)].$pwd[rand(0,31)]; // Password ของ User
$r=ldap_add($ds, "uid=s
4145217,ou=student,dc=oasitzone,dc=pn", $info);

2.2 การค้นหา User ที่ต้องพุดก่อน เพราะว่า มันใช้การ ลบ และแก้ไข User ด้วยครับ (อำนวยความสะดวก เพราะ ผมเองก็ไม่จำหรอกครับ ว่า มี Ou กะ DN อะไรบ้าง จำแต่ว่ามี User อะไรบ้างก็พอ)

การ เพิ่ม การลบ การแก้ไข User เวลาใช้ ldap_bind ต้องใช้ User พิเศษ ครับ ให้ดูใช้ /slapd.conf

ส่วนของ rootdn และ rootpw

แต่การ ค้นหา ให้ใช้ แค่ dn ก็พอครับ (user+ou+suffix)

$sr=ldap_search($ds, "dc=oasitzone,dc=pn", "uid=".$login."",$justthese);
$info = ldap_get_entries($ds, $sr);
print_r($info[
0])

การค้นหาแบบนี้จะเป็นการดึงข้อมูลของ User ทั้งหมดมา ถ้าเราต้องการแบ่งบางส่วนให้แก้ไขดังนี้

$justthese = array("dn","cn","uid"); //ต้องการอะไรก็ใส่เข้าไป
$sr=ldap_search($ds, "dc=oasitzone,dc=pn", "uid=s4145217",$justthese);
$info
1 = ldap_get_entries($ds, $sr);
print_r($info[
0])

2.3 การลบ User

$sr=ldap_search($ds, "dc=oasitzone,dc=pn", "uid=s4145217");
$info = ldap_get_entries($ds, $sr);
$r=ldap_delete($ds,$info
1[0]["dn"]);

2.4 การแก้ไข User

$sr=ldap_search($ds, "dc=oasitzone,dc=pn", "uid="s4145217"”);
$info
1 = ldap_get_entries($ds, $sr);
$info["userPassword"]=$_POST['userPassword'];
ldap_modify($ds, $info
1[0]["dn"], $info);


3. ยุติการเชื่อมต่อ ง่ายๆสั้นๆ ldap_close($ds)

บันทึกนี้เขียนที่ GotoKnow โดย  ใน programmer programmer programmer

คำสำคัญ (Tags)#opensource#php#ldap

หมายเลขบันทึก: 6365, เขียน: 04 Nov 2005 @ 09:37 (), แก้ไข: 22 Jun 2012 @ 14:49 (), สัญญาอนุญาต: สงวนสิทธิ์ทุกประการ, ดอกไม้: 1, ความเห็น: 6, อ่าน: คลิก


ความเห็น (6)

สาว
IP: xxx.12.74.8
เขียนเมื่อ 

งงกับขั้นตอนการใช้ ldapbind
ldapbind  ก็เหมือนกับเรา login เข้าใช้เครื่องธรรมดาใช้ไหม
แต่ถ้าเราใช้ rootdn กับ rootpw ก็เหมือนกับเราเข้าไปในฐานะ root ใช้ไหม

e-than
IP: xxx.147.74.4
เขียนเมื่อ 

ผมลองทำ ดู แล้ว

มัน login ได้ครับ และ เมื่อ logout ออก แล้ว

พอจะ login อีกครั้ง login ไม่ได้เลย ไม่ว่าจะเป็น username ใดๆ ก้ตาม รวมถึง การจะเข้าไป check username ใหม่ ก้ไม่สามารถทำงานได้

เป็นเพราะ รัยครับ

เขียนเมื่อ 
ลองตรวจสอบตัวแปรทุกตัวดูครับว่าค่ามันเปลี่ยนไปหรือไม่
Aziin
IP: xxx.151.232.70
เขียนเมื่อ 

ldap_modify ใช้ยังไงครับ งงง

เขียนเมื่อ 

$sr=ldap_search($ds, "dc=oasitzone,dc=pn", "uid="s4145217"”);

$info1 = ldap_get_entries($ds, $sr);

$info["userPassword"]=$_POST['userPassword'];

ldap_modify($ds, $info1[0]["dn"], $info);

คุณต้องเตรียมข้อมูลก่อนครับ ว่าจัแก้ไขอะไร

ตัวอย่างเป็นการแก้ไข Password

แล้วใช้คำสั่ง ldap_modify โดยใช้ dn ของ user

กำลังศึกษาเรื่องการทำหน้า Login เพื่อเชื่อมกับ Active Directory ในการเพิ่มหรือแก้ไข Password พอจะมีคำแนะนำมั้งไหมคะ มือใหม่มาก ไม่ค่อยเข้าใจเลย