0

我正在尝试使用(并理解)安全性在 Symfony 中的工作方式。我创建了一个登录表单,它适用于硬编码的用户。

现在我想在我的数据库中使用现有的用户表。该表具有所有必需的字段,但具有不同的列名。该实体也存在,也有不同的名称(例如“customUserId”而不是“id”)。

类似于(使用“MAGIC_MAPPING”):

/**
 * @ORM\Table(name="custom_user_table")
 * @ORM\Entity
 */
class User implements UserInterface, \Serializable
{
    /**
     * @ORM\Column(name="customUserId", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @MAGIC_MAPPING so it links this to the mandatory "id" field
     */
    private $customUserId;

    ...
}

有没有办法映射我现有的字段,以便 Symfony 将它们用于登录目的?或者至少我可以在不改变我的数据库结构(只有实体类)的情况下让它工作?

我从这个论坛和 Symfony 文档中尝试了几种操作,但它总是以我无法修复的丑陋错误结束。

有什么想法或线索吗?非常感谢您的帮助,我已经为此苦苦挣扎了几个小时...

4

3 回答 3

2

您必须更改 security.yml 文件中的提供程序配置

这是一个示例,我使用管理员实体的电子邮件字段,我认为您可以对您的实体执行相同的操作

providers: administrator: entity: { class: Entity:Administrator, property: email }

于 2016-01-29T09:35:53.950 回答
0

尝试更改该表的 ORM 文件。使用命令提示符创建 ORM 文件。然后编辑 orm 文件。

    <mapped-superclass name="FOS\UserBundle\Entity\User" table="your_table_name">
    /.../
   </mapped>
于 2016-01-29T09:57:44.483 回答
0

Benoît的回答帮助我弄清楚。我对 Symfony 文档的创建过程给予了太多的关注,以至于我忘记了最重要的一点:UserInterface. 无需映射任何东西,只需实现此接口和定义的方法,例如:

public function getUsername() {
    return $this->customLogin;
}

然后更新提供者配置(感谢 Benoit):

providers:          

    db_sam_provider:
        entity:
            class: AppBundle:User
            property: customLogin 

其他部分符合 Symfony 文档:herehere

于 2016-01-29T10:48:17.133 回答