【问题标题】:Symfony multiple user types and custom user providerSymfony 多种用户类型和自定义用户提供程序
【发布时间】:2018-07-27 11:17:32
【问题描述】:

我正在为类似于 Uber 的应用程序设计架构和数据库。而且我坚持设计User 实体并创建自定义用户提供程序。 Userdriver和customer有两种类型。用户可以将他的电子邮件注册为driver 和customer。

是否有好的阅读或项目可以让我了解创建具有多种用户类型的应用的最佳方法。

这是我目前想出的:

我从抽象的User 实体开始

/**
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"customer" = "Customer", "driver" = "Driver"})
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 */
abstract class User {
     /**
      * @ORM\Id()
      * @ORM\GeneratedValue()
      * @ORM\Column(type="integer")
      */
      protected $id;
}

Customer 类看起来像:

class Customer extends User
{
  /**
   * @ORM\Id()
   * @ORM\GeneratedValue()
   * @ORM\Column(type="integer")
   */
  protected $id;

  /**
   * @var string
   *
   * @ORM\Column(type="string", nullable=false, name="email", unique=true)
   */
  protected $email;

Driver类:

 class Driver extends User
   {
  /**
   * @ORM\Id()
   * @ORM\GeneratedValue()
   * @ORM\Column(type="integer")
   */
  protected $id;

  /**
   * @var string
   *
   * @ORM\Column(type="string", nullable=false, name="email", unique=true)
   */
  protected $email;

但是我不确定这个用户实体结构是否是一个好主意。但是,如果我继续使用这个数据库模型,那么用户授权的最佳策略是什么? 我打算使用 FOS oAuth 来保证安全。为每种类型的User 设置单独的防火墙会更好吗?

【问题讨论】:

    标签: php symfony fosuserbundle symfony4 fosoauthserverbundle


    【解决方案1】:

    您应该考虑基于角色的方法,而不是基于类型的设计

    如果您需要多态查询和关系,joined 策略可能是您的最佳选择

    这样,用户可以将他的电子邮件注册为司机和客户。 用户 A 具有角色 [DRIVER_ROLE, USER_ROLE]

    【讨论】:

    • 为了避免对新 Symfony 用户的误导/错别字,最好在您的示例中更正 ROLE_DRIVER,ROLE_CUSTOMER,因为在 Symfony 中,分配给用户的每个角色都必须以 ROLE_ 前缀开头.
    • 您好,感谢您的回复。这很有帮助。我有后续问题。如果用户有 aboutMe 属性需要根据他切换到的配置文件(司机或客户)进行更改怎么办?
    • 那你最好把这两种用户分开。关于使用相关防火墙处理此问题的一点阅读:medium.com/@bpolaszek/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2015-08-10
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多