如何使用 FOS User Bundle 和 Symfony 4 通过 JMS 序列化程序从用户实体中排除密码字段?

问题描述 投票:0回答:1

我使用 FOSUserBundle 和 JWT(使用 LexikJWTAuthenticationBundle)实现了具有登录功能的简单 API。一切正常,我可以登录并获得 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
实体扩展而来。

这就是我从 API 获取用户详细信息时响应 JSON 的样子:

{
    "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 中发生了很大变化,现在不需要使用捆绑包,而且我没有为这个简单的应用程序使用捆绑包。

php symfony4 fosuserbundle jmsserializerbundle
1个回答
0
投票

从扩展 FOS 用户捆绑包用户实体的实体中排除密码属性的正确方法是配置 packages/jms_serializer.yaml 配置,如下所示:

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

另请注意,namespace_prefix 必须使用单个 \,因为这不起作用:

namespace_prefix: 'FOS\\UserBundle'

第二步是为 FOS 用户实体创建 JMS 序列化文件,具体如下:

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 中

令我困惑的一件事是,您无法在子类的配置文件中配置父类的序列化属性。

例如,如果您要使用另一个实体 SystemUser 扩展 FOS\UserBundle\Model\User 实体,并在 src/serialization/Entity.SystemUser.yml 中为该新实体创建序列化配置文件。从该 Entity.SystemUser.yml 文件中,您不能排除或配置其中的任何属性
FOS\UserBundle\Model\User 实体。对于每个父类实体,您必须创建自己的序列化配置文件。

更改序列化配置后也不要忘记清除缓存。

© www.soinside.com 2019 - 2024. All rights reserved.