Как исключить поле пароля из пользовательского объекта с помощью сериализатора JMS с использованием FOS User Bundle и Symfony 4?

Я реализовал простой API с функцией входа в систему, используя FOSUserBundle и JWT (используя LexikJWTAuthenticationBundle). Все работает хорошо, я могу войти в систему и получить токен jwt. Но когда я создал конечную точку API для получения сведений о пользователе, в ответе также отправляется поле пароля.

Мой метод контроллера для получения сведений о пользователе выглядит так:

/**
 * @Route("/get/{id}", name="api_auth_get_user_by_id",  methods={"GET"})
 *
 * @param Request              $request
 * @param UserManagerInterface $userManager
 *
 * @return JsonResponse|\Symfony\Component\HttpFoundation\RedirectResponse
 */
public function getById(SystemUser $user)
{
    return $this->handleView($this->view($user));
}

Моя пользовательская сущность выглядит так:

<?php

namespace App\Entity\Api\Auth;

use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class SystemUser extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }
}

Итак, как вы можете видеть, моя сущность SystemUser простирается от сущности BaseUser, которая находится в FOSUserBundle.

Вот как выглядит ответ JSON, когда я получаю данные пользователя из API:

{
    "id": 1,
    "username": "test",
    "username_canonical": "test",
    "email": "[email protected]",
    "email_canonical": "[email protected]",
    "enabled": true,
    "password": "$2y$13$DnyFxYyJXQe3Z7chsJYwe.LUsuOWPqBtFm5.O0vwldX5AoMGld9ca",
    "last_login": "2019-08-27T06:19:43-04:00",
    "groups": [],
    "roles": []
}

Итак, как я могу исключить свойство пароля из ответа. Я использую последнюю версию Symfony 4.3. Я знаю, что в более ранних версиях Symfony вы могли создать конфигурацию сериализатора jms для каждого объекта в вашем пакете, но в Symfony 4 многое изменилось, и теперь использование пакетов не обязательно, и я не использую пакет для этого простого приложения.


person Caslav Sabani    schedule 27.08.2019    source источник
comment
Как / где вы сериализируете свою пользовательскую сущность?   -  person yivi    schedule 27.08.2019
comment
Я использую метод handleView из пакета fos rest: return $ this- ›handleView ($ this-› view ($ user)); Кроме этого, я не выполняю никаких сериализаций. Я знаю, как сделать поле исключения в Symfony 3, но не в Symfony 4   -  person Caslav Sabani    schedule 27.08.2019
comment
Возможный дубликат JMSSerializerBundle. нет контроля над сторонними метаданными   -  person Nicolai Fröhlich    schedule 27.08.2019
comment
в настоящее время этот вопрос повторяется. Вопрос, который вы разместили здесь, был задан почти 6 лет назад и не имеет ничего общего с Symfony 4.   -  person Caslav Sabani    schedule 27.08.2019


Ответы (1)


Правильный способ исключить свойство пароля из сущности, которая расширяет пользовательский пакет FOS User Bundle, - это настроить конфигурацию packages / jms_serializer.yaml следующим образом:

jms_serializer:
    metadata:
        auto_detection: true
        directories:
            FOSUB:
                namespace_prefix: 'FOS\UserBundle'
                path: '%kernel.root_dir%/serializer' 

Также обратите внимание, что namespace_prefix должен использовать single \, так как это НЕ РАБОТАЕТ:

namespace_prefix: 'FOS\\UserBundle'

Второй шаг - создать файл сериализации JMS для объекта FOS User, например, следующим образом:

FOS\UserBundle\Model\User:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        username:
            expose: true
        password:
            expose: false
        email:
            expose: true
        last_login:
            expose: true
        enabled:
            expose: true

который можно сохранить в src / serializer / Model.User.yml

Меня смущало то, что вы не можете настроить свойства сериализации для родительского класса в файле конфигурации для дочернего класса.

Например, если вы хотите расширить объект FOS \ UserBundle \ Model \ User с помощью другого объекта SystemUser, и вы создаете файл конфигурации сериализации для этого нового объекта в src / serialization / Entity.SystemUser.yml. Из этого файла Entity.SystemUser.yml вы НЕ МОЖЕТЕ исключить или настроить какие-либо свойства, которые являются частью объекта
FOS \ UserBundle \ Model \ User. Для каждой сущности родительского класса вы должны создать свой собственный файл конфигурации сериализации.

Также не забудьте очистить кеш после изменения конфигурации сериализации.

person Caslav Sabani    schedule 29.08.2019