我正在使用Symfony框架 v 2.4.2 更新现有网站,该网站执行双重检查以记录用户:
ldap_bind()
功能); 如何在Symfony2中复制此身份验证过程?
到目前为止,我遇到了FOSUserBundle和FR3DLdapBundle:我设法使用链式提供程序(ldap
和db
),但看似LDAP凭据完全被忽略:用户可以使用存储在数据库中的凭据登录,即使ldap_bind()
失败 - 这是第1点和第2点的确切相反。 2。
此外,在使用FOSUserBundle时,似乎必须将密码存储在数据库中。
请注意点号。 2:用户必须可以自由地从网站外部(即从Active Directory)更改其LDAP密码,然后使用新凭据登录,而无需更新网站的用户数据库。
欢迎任何解决方案,我不太喜欢FOSUserBundle,更不喜欢FR3DLdapBundle。
答案 0 :(得分:4)
我这样做了:
providers
中的app/config/security.yml
部分; 答案 1 :(得分:3)
您需要为LDAP定义一个CustomUserProvider,它将在AD和您的security.yml中找到用户,您需要设置此提供程序(Custom User Provider)
providers:
ldap_provider:
id: myprovider.security.user.provider # as you know when you create a custom web service provider you need to define it as a service and use the ID of the service here #
您还需要在防火墙中启用服务 下一步是为LDAP创建自定义身份验证提供程序,通过LDAP对用户和密码进行身份验证,并从数据库返回用户对象(Custom Authentication Provider)
首先基于此过程,它将尝试在LDAP中查找用户(如果存在),它将继续通过LDAP进行身份验证,如果用户通过身份验证,则将从DB返回用户对象
以下是自定义用户提供商的示例
public function loadUserByUsername($username)
{
$ldap_obj = new adLDAP('exampl.ldapdircetory.com', 'prot', 'Base_DN', 'ldap_admin_user', 'ldap_admin_pass'));
$filter = "( &(objectclass=person)( |(uid=".$username.")(cn=".$username.")(mail=".$username.") ) )";
$info = $ldap_obj->search_user($filter);
if ($info['count'] != 0) {
// create temp User instance of UserInterface base on the returned info
$user = new User();
...
return $user
}
else {
throw new UsernameNotFoundException('No match username was found.');
}
我假设你有adLDAP类来通过LDAP验证用户