2012-06-25 76 views
0

實際上是否有人將這兩者整合?我現在正在努力做到這一點,但我不知道如何克服我遇到的問題。Symfony2:實際上將FR3DLdapBundle與FOSUserBundle集成在一起存在問題

首先,我的版本:

  • 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 --------------------------+ 

這告訴我,我居然無法實現對用戶的通過堅持LDAP身份驗證一些東西延伸到FOS\UserBundle\Entity\User,這感覺就像是說「完全不與FOSUserBundle集成」一樣,儘管這似乎是FR3DLdapBundle的整體目的。

如果我的用戶類延伸FOS\UserBundle\Entity\User,然後我失去所有的角色/組的好東西是FOSUserBundle提供開箱即用的。

我錯過了文檔中的內容嗎?我不知道如何完成這項工作。

回答

1

我不明白你的問題是什麼。如果您設置密碼並將其存儲在數據庫中,那麼身份驗證將針對數據庫而不是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

問候

+0

我知道這是一個老的文章,但我希望得到一個更好的理解,當你說:「如果你在DB中設置一個密碼,並儲存它,然後驗證將是對DB而不是Ldap「。是否有可能將用戶存儲在數據庫中,但是仍然使用LDAP進行身份驗證? (這就是我想要做的) – Christian

+0

是的,只是不填充提供商陣列,並保持fr3d_ldap在您的防火牆 – Maks3w

+0

您的信息幫助。我還必須花更多時間在config.yml中正確設置ldap設置,現在我可以登錄了!任何關於爲什麼第二次登錄來自同一用戶的指針會導致系統嘗試第二次保存用戶並因此失敗? – Christian

相關問題