如何防止 Symfony 中易受攻击实体的延迟加载

我的问题很简单,但我在网上搜索了一个小时后没有找到任何线索。


我正在尝试构建一个 Symfony API,但是当返回 json 输出时,它会延迟加载输出中的每个关系。虽然这不是什么大问题(在大多数情况下),但当它对用户信息执行此操作时,情况确实很糟糕。因此,所有内容(密码、电子邮件等)都会显示出来。


我的问题是:是否可以在学说中将一个实体标记为受保护,这样就不会使用该实体进行自动加载?在某些情况下它非常方便,但这是一个很大的缺陷。如果无法标记实体,是否可以完全停用它或在集合元素上停用它?


提前致谢


编辑:


class User implements UserInterface

{

    /**

     * @ORM\Id()

     * @ORM\GeneratedValue()

     * @ORM\Column(type="integer")

     */

    private $id;


    /**

     * @ORM\Column(type="string", length=180, unique=true)

     */

    private $email;

    /**

     * @var string The hashed password

     * @ORM\Column(type="string")

     */

    private $password;

    /**

     * @ORM\OneToOne(targetEntity="App\Entity\Profile", mappedBy="user", cascade={"persist", "remove"})

     */

    private $profile;


getter 和 setter 都在那里。


还有一个 Profile 类,即所有关系的接口。它具有 1to1 的关系。


class Profile

{

    /**

     * @ORM\Id()

     * @ORM\GeneratedValue()

     * @ORM\Column(type="integer")

     */

    private $id;


    /**

     * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="profile", cascade={"persist", "remove"})

     * @ORM\JoinColumn(nullable=false)

     */

    private $user;


getter 和 setter 就在那里。


class Event

{

    /**

     * @ORM\Id()

     * @ORM\GeneratedValue()

     * @ORM\Column(type="integer")

     */

    private $id;


    /**

     * @ORM\Column(type="datetime")

     */

    private $date;



    /**

     * @ORM\ManyToOne(targetEntity="App\Entity\Profile", inversedBy="ownedEvents")

     * @ORM\JoinColumn(nullable=false)

     */

    private $profile;


    /**

     * @ORM\OneToMany(targetEntity=Post::class, mappedBy="event", orphanRemoval=true)

     */

    private $posts;


问题是,该配置文件已加载,用户也可以使用它......以下是控制器功能。但序列化是在额外的方法中进行的。


public function getUnreactedEvents(): JsonResponse{

        $events = $this->getDoctrine()

            ->getManager()

            ->getRepository(Event::class)

            ->getUnreactedEvents($this->profileUtils->getLoggedInProfileFromDatabase()->getId());

        return new JsonResponse($this->eventUtils->eventsToArray($events));

    }



元芳怎么了
浏览 116回答 1
1回答

守着一只汪

我建议使用JMSSerializerBundle来实现这一点。它是一个广泛使用的捆绑包,也有大量的 API。您可以准确配置哪些属性应该公开,哪些不应该公开。您还可以构建用于公开属性的组并使用特定的排除策略。提示:还要检查深层嵌套对象的限制序列化深度。
打开App,查看更多内容
随时随地看视频慕课网APP