JWT 令牌的 UniqueConstraint - 如何?

问题描述

我的环境:

lexik_jwt_authentication:
   user_identity_field: phoneNumber
security:
   providers:
        chain_provider:
            chain:
                providers: ['fos_userbundle','app_user_provider']
        fos_userbundle:
            id: fos_user.user_provider.username
        app_user_provider:
            entity:
                class: App\Entity\User
                property: phoneNumber

在应用\实体\用户

/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\Table(
 *     name="`user`",*     uniqueConstraints={
 *        @ORM\UniqueConstraint(name="project_phoneNumber",columns={"project_id","phone_number"})
 *     }
 * )
 * @ORM\HasLifecycleCallbacks()
 * @JMS\ExclusionPolicy("all")
 * @Vich\Uploadable
 */

所以问题是电话号码不再是用户唯一的。 jwt中是否可以使用project_phoneNumber作为用户身份?

解决方法

您要做的是复合主键。

这是在数据库级别进行的非常好的方法。 所以你想要的方式就是好方法。

问题是即使教义说他们:

...小心翼翼地确保 Doctrine ORM 支持尽可能多的复合主键用例 https://www.doctrine-project.org/projects/doctrine-orm/en/2.8/tutorials/composite-primary-keys.html

当您面对一个不受支持的复合主键功能时,这实际上是一种真正的痛苦(例如:当您想对具有组合主键的两个实体执行 manyToMany 时...)。

所以我建议做的是始终使用 id 作为主键,即使它会违反 1NF

这是一个可接受的违规行为...我的意思是不适合我,但对于复杂的实体关系,没有其他方法可以处理它。

因此,如果您想试试运气,您可以 implement a composite primary key 并因此删除由主键本身处理的唯一约束。

否则,只需使用一个简单的自动递增的 id 就可以了(因此保持您的唯一约束)。