如何使用@ExclusionPolicy(" all")设置将POST正文内容反序列化为实体

时间:2016-05-07 01:59:07

标签: symfony fosrestbundle jmsserializerbundle symfony-2.8

我正在使用JMSSerializerBundleFOSRestBundle,并且我试图通过@ParamConverter注释反序列化我的正文请求:

/**
 * @View()
 *
 * @Route("/users/{username}/globaltoken", defaults={"_format" = "json"}, requirements={"user"="\w+"})
 * @ParamConverter(
 *     "userBody", class="Belka\AuthBundle\Entity\User",
 *     converter="fos_rest.request_body"
 * )
 */
public function postAction($username, User $userBody)
{
...

User实体设置@ExclusionPolicy("all"),某些属性为@expose d。当我序列化时,这是完美的;不幸的是,当我将我的身体反序列化为一个User物体时,没有设置未暴露的属性。有没有一个干净的方法来处理这个?

1 个答案:

答案 0 :(得分:0)

回答自己:@ExclusionPolicy(“all”)不是出于安全目的而想要的。该标记用于处理不应序列化的数据,无论是否出于安全原因有时不应出现。这是一个静态的东西,就像那样。

我真正想要的是使用groups管理要显示与否的内容(或考虑反序列化)。因此:

  1. 声明一些组并分配属性
  2. 在控制器中使用所需的组:反序列化和序列化将仅考虑属于至少一个声明的组的属性。
  3. 一个例子:

    *实体*

    class User implements EncoderAwareInterface
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="string")
         * @Assert\NotBlank(message = "user.username.not_blank")
         * @ORM\GeneratedValue(strategy="NONE")
         * @Serializer\Groups({"default"})
         */
        private $username;
    
        /**
         * @ORM\Column(type="string", nullable=true)
         * @Serializer\Groups("personal")
         */
        private $password;
    
        ...
    

    *控制器*

    /**
     * @ParamConverter(
     *     "userBody",
     *     class="Belka\AuthBundle\Entity\User",
     *     converter="fos_rest.request_body",
     *     options={"deserializationContext"={"groups"={"personal"}}}
     * )
     */
    public function postAction($username, User $userBody, $_format)
    {
    

    这样,只有密码才会被反序列化。