PHPでLdap認証をする方法

  • 2020.02.16
  • PHP
PHPでLdap認証をする方法

PHPでLdap認証をする方法を紹介します。
Active Directoryは、Windows Server 2016を想定しています。

認証手順

1.Ldapユーザでのコネクション接続
2.Ldapユーザでのバインド接続
3.ユーザの存在確認
4.ユーザでのバインド接続
5.認証確認

サンプルソース

ldap関数については、公式のPHPマニュアルを参照してください。

// Ldapサーバー
$ldap_server = "ldap://localhost:389";

// Ldapユーザー
$ldap_user = "ldapuser";

// ベースのDN
$base_dn = "OU=tset,DC=example,DC=com"; // DN

// アカウント
$user_id 	= "user01";   // ユーザ名
$user_password 	= "password"; // パスワード

// コネクション接続
$ldapconn = ldap_connect($ldap_server);
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);

if(!$ldapconn){
	echo "コネクション接続できません";
	exit;
}
else{
	// バインド接続
	$ldapbind = ldap_bind($ldapconn, "CN=" . $ldap_user . "," . $base_dn, "password");
	
	if(!$ldapbind){
		//コネクション切断
		ldap_unbind($ldapconn);

		echo "バインド接続できません";
		exit;
	}
}

if($ldapconn!==false){

	// ユーザの存在確認
	$user_filter = "(sAMAccountName=" . $user_id . ")";
	$ldapres = ldap_search($ldapconn, $base_dn, $user_filter, array("distinguishedName"));

	if(ldap_count_entries($ldapconn, $ldapres)==0){
		echo "ユーザが存在しない";
	}
	else{
		// DN名の取得
		$ldapentry = ldap_first_entry($ldapconn, $ldapres);
		$distinguishedNameArr = ldap_get_values($ldapconn, $ldapentry, "distinguishedName");
		$distinguishedName = $distinguishedNameArr[0];

		// バインド接続
		$ldapbind_user = ldap_bind($ldapconn2, $distinguishedName, $user_password);

		if(!$ldapbind_user){
			echo "認証失敗";
		}
		else{
			echo "認証成功";
		}
	}

	//コネクション切断
	ldap_unbind($ldapconn);
}