如何在 PHP 中执行 LDAP 绑定给定的电子邮件和密码?
How to perform LDAP bind given email and password in PHP?
我正在开发使用 LDAP 进行身份验证的应用程序。目前我可以使用 uid
和 password
对用户进行身份验证。
我正在使用在线 LDAP 测试服务器 (http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/#comment-5882)
进行测试
这是我的代码:
<?php
$ldapConn = ldap_connect('ldap.forumsys.com');
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
//sample path for authentication
ldap_bind($ldapConn, 'uid=riemann,dc=example,dc=com', 'password');
//example path for searching
$search = ldap_search($ldapConn, "uid=riemann,dc=example,dc=com", "(cn=*)");
$searchData = ldap_get_entries($ldapConn, $search);
print_r($searchData);
代码搜索用户并使用 uid
属性对他们进行身份验证,但现在我想根据用户的电子邮件地址对用户进行身份验证。
通常,您的 LDAP 服务器将允许匿名访问以进行搜索,或者您将 绑定(验证)LDAP 服务器以执行搜索,并且 再次绑定 与找到的用户的 DN 及其密码以检查密码。
在您的代码中,您稍后在没有 bind 的情况下作为用户 DN 检查 his/her 密码。如果 LDAP 服务器允许匿名搜索,则可以跳过第一个 ldap_bind
。
简而言之,没有正确的错误处理和使用在线 LDAP 测试服务器:
if(ldap_bind($ldapConn, 'cn=read-only-admin,dc=example,dc=com', 'password')) {
// search the LDAP tree from dc=example,dc=com looking for entries with
// specified mail attribute, returning only the dn and limiting the search
// to 1 result
$result = ldap_search($ldapConn, 'dc=example,dc=com', "(mail=$mail)", array('dn'), 0, 1)
$entries = ldap_get_entries($ldapConn, $result);
if ($entries['count'] != 1) {
if (ldap_bind($ldapConn, $entries[0]['dn'], $password)) {
// user with mail $mail is checked with password $password
}
}
}
ldap_close($ldapConn);
不要忘记检查给定的 $mail
电子邮件语法是否正确,因为您可能会遇到安全问题 - LDAP 注入。
首先:归功于@Zoran Regvart。
问题是 ldap_search()
函数中只有 4 个参数,检查 $entries['count'] > 0
$ldapConn = ldap_connect('ldap.forumsys.com');
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
$password='password';
$mail = 'riemann@ldap.forumsys.com';
if(ldap_bind($ldapConn, 'cn=read-only-admin,dc=example,dc=com', 'password')) {
$arr = array('dn', 1);
$result = ldap_search($ldapConn, 'dc=example,dc=com', "(mail=$mail)", $arr);
$entries = ldap_get_entries($ldapConn, $result);
echo "<br><hr>";
print_r($entries);
if ($entries['count'] > 0) {
if (ldap_bind($ldapConn, $entries[0]['dn'], $password)) {
// user with mail $mail is checked with password $password
echo 'user auth success';
}else{
echo 'user auth failed';
}
}
}
ldap_close($ldapConn);
我正在开发使用 LDAP 进行身份验证的应用程序。目前我可以使用 uid
和 password
对用户进行身份验证。
我正在使用在线 LDAP 测试服务器 (http://www.forumsys.com/tutorials/integration-how-to/ldap/online-ldap-test-server/#comment-5882)
这是我的代码:
<?php
$ldapConn = ldap_connect('ldap.forumsys.com');
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
//sample path for authentication
ldap_bind($ldapConn, 'uid=riemann,dc=example,dc=com', 'password');
//example path for searching
$search = ldap_search($ldapConn, "uid=riemann,dc=example,dc=com", "(cn=*)");
$searchData = ldap_get_entries($ldapConn, $search);
print_r($searchData);
代码搜索用户并使用 uid
属性对他们进行身份验证,但现在我想根据用户的电子邮件地址对用户进行身份验证。
通常,您的 LDAP 服务器将允许匿名访问以进行搜索,或者您将 绑定(验证)LDAP 服务器以执行搜索,并且 再次绑定 与找到的用户的 DN 及其密码以检查密码。
在您的代码中,您稍后在没有 bind 的情况下作为用户 DN 检查 his/her 密码。如果 LDAP 服务器允许匿名搜索,则可以跳过第一个 ldap_bind
。
简而言之,没有正确的错误处理和使用在线 LDAP 测试服务器:
if(ldap_bind($ldapConn, 'cn=read-only-admin,dc=example,dc=com', 'password')) {
// search the LDAP tree from dc=example,dc=com looking for entries with
// specified mail attribute, returning only the dn and limiting the search
// to 1 result
$result = ldap_search($ldapConn, 'dc=example,dc=com', "(mail=$mail)", array('dn'), 0, 1)
$entries = ldap_get_entries($ldapConn, $result);
if ($entries['count'] != 1) {
if (ldap_bind($ldapConn, $entries[0]['dn'], $password)) {
// user with mail $mail is checked with password $password
}
}
}
ldap_close($ldapConn);
不要忘记检查给定的 $mail
电子邮件语法是否正确,因为您可能会遇到安全问题 - LDAP 注入。
首先:归功于@Zoran Regvart。
问题是 ldap_search()
函数中只有 4 个参数,检查 $entries['count'] > 0
$ldapConn = ldap_connect('ldap.forumsys.com');
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapConn, LDAP_OPT_REFERRALS, 0);
$password='password';
$mail = 'riemann@ldap.forumsys.com';
if(ldap_bind($ldapConn, 'cn=read-only-admin,dc=example,dc=com', 'password')) {
$arr = array('dn', 1);
$result = ldap_search($ldapConn, 'dc=example,dc=com', "(mail=$mail)", $arr);
$entries = ldap_get_entries($ldapConn, $result);
echo "<br><hr>";
print_r($entries);
if ($entries['count'] > 0) {
if (ldap_bind($ldapConn, $entries[0]['dn'], $password)) {
// user with mail $mail is checked with password $password
echo 'user auth success';
}else{
echo 'user auth failed';
}
}
}
ldap_close($ldapConn);