login with user from active directory อยากให้ระบบตรวจสอบ user na
หากต้องการให้ login โดยใช้ user name ,password จาก active directory ต้องแก้ไขอย่างไรครับ
LDAP ใช่มั้ยครับ
ดูที่คลาส \Gcms\Login เลยครับ เปลี่ยนส่วนตรวจสอบจากฐานข้อมูลเป็น LDAP ครับ
ดูที่คลาส \Gcms\Login เลยครับ เปลี่ยนส่วนตรวจสอบจากฐานข้อมูลเป็น LDAP ครับ
ผมเคยทำในลักษณะ Submit Method Post แล้วส่งค่ามากับตัวแปร รบกวนไกด์ให้หน่อยครับ ค่าที่ใช้ในการตรวจสอบจะประมาณนี้ครับ
function authenticate($user, $password) {
if(empty($user) || empty($password)) return false;
// active directory server
$ldap_host = "ldap.domain.com";
// active directory DN (base location of ldap search)
$ldap_dn = "OU=Department,DC=domain,DC=com";
// active directory user group name
$ldap_user_group = "IT";
// active directory manager group name
$ldap_manager_group = "HR";
// domain, for purposes of constructing $user
$ldap_usr_dom = '@domain.com';
// connect to active directory
$ldap = ldap_connect($ldap_host);
// configure ldap params
ldap_set_option($ldap,LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($ldap,LDAP_OPT_REFERRALS,0);
// verify user and password
if($bind = @ldap_bind($ldap, $user.$ldap_usr_dom, $password)) {
// valid
// check presence in groups
$filter = "(sAMAccountName=".$user.")";
$attr = array("memberof");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
ldap_unbind($ldap);
// check groups
$access = 0;
foreach($entries[0]['memberof'] as $grps) {
// is manager, break loop
if(strpos($grps, $ldap_manager_group)) { $access = 2; break; }
// is user
if(strpos($grps, $ldap_user_group)) $access = 1;
}
if($access != 0) {
// establish session variables
$_SESSION['user'] = $user;
$_SESSION['access'] = $access;
return true;
} else {
// user has no rights
return false;
}
} else {
// invalid name or password
return false;
}
}
function authenticate($user, $password) {
if(empty($user) || empty($password)) return false;
// active directory server
$ldap_host = "ldap.domain.com";
// active directory DN (base location of ldap search)
$ldap_dn = "OU=Department,DC=domain,DC=com";
// active directory user group name
$ldap_user_group = "IT";
// active directory manager group name
$ldap_manager_group = "HR";
// domain, for purposes of constructing $user
$ldap_usr_dom = '@domain.com';
// connect to active directory
$ldap = ldap_connect($ldap_host);
// configure ldap params
ldap_set_option($ldap,LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($ldap,LDAP_OPT_REFERRALS,0);
// verify user and password
if($bind = @ldap_bind($ldap, $user.$ldap_usr_dom, $password)) {
// valid
// check presence in groups
$filter = "(sAMAccountName=".$user.")";
$attr = array("memberof");
$result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
$entries = ldap_get_entries($ldap, $result);
ldap_unbind($ldap);
// check groups
$access = 0;
foreach($entries[0]['memberof'] as $grps) {
// is manager, break loop
if(strpos($grps, $ldap_manager_group)) { $access = 2; break; }
// is user
if(strpos($grps, $ldap_user_group)) $access = 1;
}
if($access != 0) {
// establish session variables
$_SESSION['user'] = $user;
$_SESSION['access'] = $access;
return true;
} else {
// user has no rights
return false;
}
} else {
// invalid name or password
return false;
}
}
ขั้นตอนการ Login ของคชสารเป็นดังนี้ครับ
1.ตรวจสอบ username+password กับฐานข้อมูล ขั้นตอนนี้ ทดแทนได้ด้วย LDAP ครับ อยู่ใน Gcms/Login สามารถแก้ไขหรือเปลี่ยนได้เอง (ไม่น่ายาก แต่ถ้าทพไม่ได้ ข้อถัดไปยากกว่าอีก)
2.ถ้า Login สำเร็จ จะบันทึกการ login ลง session ที่ $_SESSION['login'] และ password จะถูกแทนที่ด้วย Token
3.การตรวจสอบการ Login คราวต่อไป จะใช้ Token ในการตรวจสอบการเข้าระบบ
ปัญหาของการใช้ LDAP หลักๆก็คือ เมื่อมีการ login ด้วย LDAP แล้ว จะต้องมีการลงทะเบียนสมาชิก กับระบบ เนื่องจากข้อมูลจาก LDAP อาจไม่สอดคล้องกับที่ระบบต้องการ และ ใช้ในการลงทะเบียน Token ด้วย ลองทำดูนะครับ
1.ตรวจสอบ username+password กับฐานข้อมูล ขั้นตอนนี้ ทดแทนได้ด้วย LDAP ครับ อยู่ใน Gcms/Login สามารถแก้ไขหรือเปลี่ยนได้เอง (ไม่น่ายาก แต่ถ้าทพไม่ได้ ข้อถัดไปยากกว่าอีก)
2.ถ้า Login สำเร็จ จะบันทึกการ login ลง session ที่ $_SESSION['login'] และ password จะถูกแทนที่ด้วย Token
3.การตรวจสอบการ Login คราวต่อไป จะใช้ Token ในการตรวจสอบการเข้าระบบ
ปัญหาของการใช้ LDAP หลักๆก็คือ เมื่อมีการ login ด้วย LDAP แล้ว จะต้องมีการลงทะเบียนสมาชิก กับระบบ เนื่องจากข้อมูลจาก LDAP อาจไม่สอดคล้องกับที่ระบบต้องการ และ ใช้ในการลงทะเบียน Token ด้วย ลองทำดูนะครับ