Symfony2:使用LDAP(Active Directory)和DB进行用户身份验证

时间:2014-03-19 09:20:54

标签: symfony authentication active-directory

我正在使用Symfony框架 v 2.4.2 更新现有网站,该网站执行双重检查以记录用户:

  1. 首先,它检查用户名和密码是否属于有效的Active Directory用户(使用PHP的ldap_bind()功能);
  2. 如果是这样,它会针对数据库表检查仅用户名数据库中没有存储密码);
  3. 如果在数据库表中找到用户名,则网站会从数据库加载用户配置文件,并对用户进行身份验证。
  4. 如何在Symfony2中复制此身份验证过程?

    到目前为止,我遇到了FOSUserBundle和FR3DLdapBundle:我设法使用链式提供程序(ldapdb),但看似LDAP凭据完全被忽略:用户可以使用存储在数据库中的凭据登录,即使ldap_bind()失败 - 这是第1点和第2点的确切相反。 2。

    此外,在使用FOSUserBundle时,似乎必须将密码存储在数据库中。

    注意点号。 2:用户必须可以自由地从网站外部(即从Active Directory)更改其LDAP密码,然后使用新凭据登录,而无需更新网站的用户数据库。

    欢迎任何解决方案,我不太喜欢FOSUserBundle,更不喜欢FR3DLdapBundle。

2 个答案:

答案 0 :(得分:4)

我这样做了:

  1. 基于FOSU​​SerBundle用户模型创建了自定义用户实体;
  2. 创建了一个自定义用户提供程序(请参阅Javad对此问题的回答),将其注册为服务并将其添加到providers中的app/config/security.yml部分;
  3. 从v2.4开始,Symfony(幸运的是)提供了一个简化的身份验证系统,它不会强迫您通过所有自定义身份验证提供程序(IMHO真的很痛苦):它被称为身份验证器并记录了here。我实现了自己的Authenticator类,并使用我的自定义UserProvider类执行了双重检查。

答案 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验证用户