首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2:实际上将FR3DLdapBundle与FOSUserBundle集成是有问题的

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

Stack Overflow用户
提问于 2012-06-25 19:12:22
回答 1查看 1.7K关注 0票数 0

有人真的把这两者结合起来了吗?我现在正致力于这样做,但我不知道如何克服我所面临的问题。

首先,我的版本:

  • Symfony 2.0.15
  • FOSUserBundle 1.2.0
  • FR3DLdapBundle 1.5.x

目前没有问题的是如何让ldap包与我的ldap服务器联系并对用户进行身份验证。效果很好。

问题是,到了持久化用户的时候。下面是我的用户实体的样子

代码语言:javascript
复制
<?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表的样子

代码语言:javascript
复制
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进行身份验证时我将永远不会有值的所有NULL列。

那么这里的解决方案是什么?我不能为user.saltuser.password这样的列“伪造”值。

我在up上检查了FOS\UserBundle\Entity\User中的类层次结构,并且像password这样的列的需求在FOS\UserBundle\Model\UserInterface中(下面的层次结构)

代码语言:javascript
复制
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 --------------------------+

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

如果我的用户类没有扩展FOSUserBundle,那么我就失去了FOS\UserBundle\Entity\User提供的所有角色/组功能。

我在文件里漏掉了什么吗?我不知道该怎么做。

EN

回答 1

Stack Overflow用户

发布于 2012-06-29 13:49:03

我不明白你有什么问题。如果您设置了密码并将其存储在DB中,那么身份验证将针对DB而不是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)

如果在创建用户时需要填充某些用户属性,那么您可以按照此食谱并设置自己的值。

ldap-manager.md

问候

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

https://stackoverflow.com/questions/11195774

复制
相关文章

相似问题

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