0

実際に2つを統合した人はいますか?私は今そのように取り組んでいますが、私が抱えている問題を乗り越える方法がわかりません。

まず、私のバージョン:

  • シンフォニー 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特に、ユーザーが LDAP で認証するときに値を持たないすべての NOT NULL 列に起因します。

それで、ここでの解決策は何ですか?user.saltまたはのような列の値を「偽造」することはできませんuser.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 --------------------------+

これは、拡張されたものによって永続化されたユーザーの LDAP 認証を実際に実装できないことを示していますFOS\UserBundle\Entity\UserFR3DLdapBundle .

また、ユーザー クラスがextendsではない場合、 FOSUserBundleFOS\UserBundle\Entity\Userがすぐに提供するすべてのロール/グループの利点を失います。

ドキュメントの何かを見逃していませんか? これを機能させる方法がわかりません。

4

1 に答える 1

1

あなたの問題が何であるかわかりません。パスワードを設定してDBに保存すると、認証はLdapではなくDBに対して行われます。

「チェーン プロバイダー」キーの下に次のプロバイダーが必要です。

プロバイダー: [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

よろしく

于 2012-06-29T13:49:03.383 に答える