首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2:同时使用LDAP (活动目录)和DB进行用户身份验证。

Symfony2:同时使用LDAP (活动目录)和DB进行用户身份验证。
EN

Stack Overflow用户
提问于 2014-03-19 09:20:54
回答 2查看 8.9K关注 0票数 9

我正在使用Symfony框架v2.4.2更新一个现有网站,该网站执行双重检查,将用户登录到:

  1. 首先,它检查用户名和密码是否属于有效的Active用户(使用PHP的ldap_bind()函数);
  2. 如果是这样的话,它会根据DB表检查用户名仅(没有密码存储在DB中的);
  3. 如果在DB表中找到用户名,则网站将从DB加载用户配置文件,并对用户进行身份验证。

如何在Symfony2?中复制这一过程?

到目前为止,我一直在使用FOSUserBundle和FR3DLdapBundle:我成功地使用了链式提供程序(ldapdb),但是似乎LDAP凭据被完全忽略了:用户可以使用存储在DB中的凭据登录,即使ldap_bind()失败了--这与第1和第2点的正好相反。

此外,在使用FOSUserBundle时,似乎必须在DB中存储密码。

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-24 11:29:39

我是这样想出来的:

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

Stack Overflow用户

发布于 2014-03-19 15:46:33

您需要为LDAP定义一个CustomUserProvider,它将在AD中找到用户,在security.yml中需要设置此提供程序(自定义用户提供程序)。

代码语言:javascript
复制
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对用户和密码进行身份验证,并从DB (自定义身份验证提供者)返回用户对象。

基于这个过程,首先它将尝试在LDAP中找到用户,如果它存在,它将继续通过LDAP进行身份验证,如果用户经过身份验证,它将从DB返回用户对象。

以下是自定义用户提供程序的示例

代码语言:javascript
复制
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对用户进行身份验证。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22501134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档