我正在尝试创建一个用户提供程序,以便我可以通过Active Directory服务器进行身份验证。
问题在于,与大多数其他LDAP服务器不同,Active Directory不允许检索某些用户的密码属性,甚至是加密的。
这是我的用户类:
class LdapUser implements UserInterface
{
private $username;
private $first_name;
private $last_name;
private $password;
private $salt;
private $roles;
public function __construct($username, $first_name, $last_name, $password, $salt, array $roles) {
$this->username = $username;
$this->first_name = $first_name;
$this->last_name = $last_name;
$this->password = $password;
$this->salt = $salt;
$this->roles = $roles;
}
...
}
这是我的loadUserByUsername
方法(在我的UserProvider
类中):
public function loadUserByUsername($username)
{
$server = "my_ldap_server";
$root_dn = "my_root_dn";
$root_pw = "my_root_pw";
$ds = ldap_connect($server);
if ($ds) {
ldap_bind($ds, $root_dn, $root_pw);
$search = ldap_search($ds, "my_branch", "(sAMAccountName=".$username.")", array("sn", "givenName"));
$info = ldap_get_entries($ds, $sr);
if($info['count'] > 0) {
$user = $info[0];
return new LdapUser($username, $user['givenName'][0], $user['sn'][0], '???PASSWORD???', '???SALT???', array('ROLE_USER'));
} else {
throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
}
ldap_close($ds);
} else {
echo "Connexion au serveur LDAP impossible";
}
}
如您所见,我无法将密码传递给LdapUser
课程,因为无法通过Active Directory访问该密码。
但是,我认为通过使用用户在登录表单中输入的密码ldap_bind($username, $password)
来验证te用户仍然是可能的。问题是我无法弄清楚如何在LdapUserProvider
课程中访问此密码。
我试过$_POST['password']
,但我得到了一个未定义的索引错误......
欢迎任何帮助:)
答案 0 :(得分:1)
有几个LDAP身份验证包可供使用。
如下所述,您可以尝试FR3D/LdapBundle,但需要FOSUserBundle才能运行。如果您不想(或不需要)使用FOSUserBundle,也可以尝试IMAG (BorisMorel/LdapBundle)。 BorisMorel使用php-ldap工作,它不需要额外的包也不需要任何zend组件。
即使您不想使用它们,我建议您查看BorisMorel的实现以获取更多信息。代码很容易理解,因为它非常简单。
答案 1 :(得分:0)
您的代码通过发送绑定请求来设置连接的身份验证状态。此代码是否尝试搜索条目,从该条目检索密码,然后绑定为该可分辨名称?如果是这样,即使您可以检索密码,正确配置的目录服务器也不允许传输预编码的密码。密码应始终通过安全连接(TLS或SSL)以明文形式传输,以便服务器可以执行密码质量和历史验证。因此,您的代码必须事先知道明文密码。或者,符合LDAP的服务器可能允许对某些条目使用代理身份验证。
答案 2 :(得分:0)