Symfony2:实际上将FR3DLdapBundle与FOSUserBundle集成是有问题的


Symfony2: Actually integrating FR3DLdapBundle with FOSUserBundle is problematic

>有人真正整合了两者吗? 我现在正在努力这样做,我不知道如何克服我遇到的问题。

首先,我的版本:

  • Symfony 2.0.15
  • FOSUserBundle 1.2.0
  • FR3DLdapBundle 1.5.x

目前没有问题的是让 ldap 捆绑包联系我的 ldap 服务器并对用户进行身份验证。 这工作正常。

问题是什么时候需要保留用户。 这是我的用户实体的样子

<?php
namespace JWT'EufonyBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use FR3D'LdapBundle'Model'LdapUserInterface;
use FOS'UserBundle'Entity'User as BaseUser;
/**
 * JWT'EufonyBundle'Entity'User
 *
 * @ORM'Table(name="user")
 * @ORM'Entity(repositoryClass="JWT'EufonyBundle'Entity'UserRepository")
 */
class User extends BaseUser implements LdapUserInterface
{
  /**
   * Ldap Object Distinguished Name
   * @var string $dn
   */
  protected $dn;
  /**
   * @var integer $id
   *
   * @ORM'Column(name="id", type="integer")
   * @ORM'Id
   * @ORM'GeneratedValue(strategy="AUTO")
   */
  protected $id;
  /**
   * Get id
   *
   * @return integer
   */
  public function getId()
  {
      return $this->id;
  }
  /**
   * {@inheritDoc}
   */
  public function setDn($dn)
  {
    $this->dn = $dn;
  }
  /**
   * {@inheritDoc}
   */
  public function getDn()
  {
    return $this->dn;
  }
}

这就是生成的 MySQL 表的样子

mysql> describe user;
+-----------------------+--------------+------+-----+---------+----------------+
| Field                 | Type         | Null | Key | Default | Extra          |
+-----------------------+--------------+------+-----+---------+----------------+
| id                    | int(11)      | NO   | PRI | NULL    | auto_increment |
| username              | varchar(255) | NO   |     | NULL    |                |
| username_canonical    | varchar(255) | NO   | UNI | NULL    |                |
| email                 | varchar(255) | NO   |     | NULL    |                |
| email_canonical       | varchar(255) | NO   | UNI | NULL    |                |
| enabled               | tinyint(1)   | NO   |     | NULL    |                |
| salt                  | varchar(255) | NO   |     | NULL    |                |
| password              | varchar(255) | NO   |     | NULL    |                |
| last_login            | datetime     | YES  |     | NULL    |                |
| locked                | tinyint(1)   | NO   |     | NULL    |                |
| expired               | tinyint(1)   | NO   |     | NULL    |                |
| expires_at            | datetime     | YES  |     | NULL    |                |
| confirmation_token    | varchar(255) | YES  |     | NULL    |                |
| password_requested_at | datetime     | YES  |     | NULL    |                |
| roles                 | longtext     | NO   |     | NULL    |                |
| credentials_expired   | tinyint(1)   | NO   |     | NULL    |                |
| credentials_expire_at | datetime     | YES  |     | NULL    |                |
+-----------------------+--------------+------+-----+---------+----------------+

问题来自从FOS'UserBundle'Entity'User继承的所有列 - 特别是所有 NOT NULL 列,当用户使用 LDAP 进行身份验证时,我永远不会有值。

那么这里的解决方案是什么?我无法为user.saltuser.password等列"伪造"值。

我从FOS'UserBundle'Entity'User开始检查了类层次结构,并且对password等列的要求FOS'UserBundle'Model'UserInterface(下面的层次结构)

FR3D'LdapBundle'Model'LdapUserInterface <------------------------+
                                                                 |
Symfony'Component'Security'Core'User'UserInterface               |
  ^                                                              |
  +- Symfony'Component'Security'Core'User'AdvancedUserInterface  |
       ^                                                         |
       +- FOS'UserBundle'Model'UserInterface <---+               |
                                                 |               |
FOS'UserBundle'Model'UserInterface <-------------+               |
                                                 |               |
                                      implements |               |
FOS'UserBundle'Model'User -----------------------+               |
  ^                                                              |
  +- FOS'UserBundle'Entity'User                                  |
       ^                                              implements |
       +- JWT'EufonyBundle'Entity'User --------------------------+

这告诉我,我实际上无法通过扩展FOS'UserBundle'Entity'User的东西为用户实现LDAP身份验证,这感觉就像说"根本不与FOSUserBundle集成"一样,尽管这似乎是FR3DLdapBundle的全部目的。

如果我的用户类没有扩展FOS'UserBundle'Entity'User,那么我将失去 FOSUserBundle 开箱即用提供的所有角色/组好东西。

我是否遗漏了文档中的某些内容?我不知道如何做到这一点。

我不明白你的问题是什么。如果您设置密码并将其存储在数据库中,则身份验证将针对数据库而不是 Ldap。

您应该在"链提供程序"键下具有以下提供程序:

提供商: [fos_userbundle, fr3d_ldapbundle]

提供商的顺序很重要,您可以省略他们的一些,但永远不要fr3d_ldapbundle可以在fos_userbundle之前进行

(https://github.com/Maks3w/FR3DLdapBundle/blob/master/Resources/doc/index.md#6-enable-fosuserbundle-as-user-provider)

如果您在创建用户时需要填写某些用户属性,则可以按照此说明书并设置自己的值。

https://github.com/Maks3w/FR3DLdapBundle/blob/master/Resources/doc/cookbook/override_ldap-manager.md

问候