Symfony2:使用Active Directory进行身份验证

时间:2012-03-22 08:52:27

标签: authentication active-directory symfony ldap

我正在尝试创建一个用户提供程序,以便我可以通过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'],但我得到了一个未定义的索引错误......

欢迎任何帮助:)

3 个答案:

答案 0 :(得分:1)

有几个LDAP身份验证包可供使用。

如下所述,您可以尝试FR3D/LdapBundle,但需要FOSUserBundle才能运行。如果您不想(或不需要)使用FOSUserBundle,也可以尝试IMAG (BorisMorel/LdapBundle)。 BorisMorel使用php-ldap工作,它不需要额外的包也不需要任何zend组件。

即使您不想使用它们,我建议您查看BorisMorel的实现以获取更多信息。代码很容易理解,因为它非常简单。

答案 1 :(得分:0)

您的代码通过发送绑定请求来设置连接的身份验证状态。此代码是否尝试搜索条目,从该条目检索密码,然后绑定为该可分辨名称?如果是这样,即使您可以检索密码,正确配置的目录服务器也不允许传输预编码的密码。密码应始终通过安全连接(TLS或SSL)以明文形式传输,以便服务器可以执行密码质量和历史验证。因此,您的代码必须事先知道明文密码。或者,符合LDAP的服务器可能允许对某些条目使用代理身份验证。

另见

答案 2 :(得分:0)

尝试FR3dLdapBundle

如果您从Zend\Ldap

安装Zend Framework 2组件,则2.0.x分支支持Active Directory