2012-06-25 38 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

相关问题