0

我已经使用 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从.BaseUserFOSUserBundle

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

{
    "id": 1,
    "username": "test",
    "username_canonical": "test",
    "email": "test.user@super.com",
    "email_canonical": "test.user@super.com",
    "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 中发生了很大变化,现在不需要使用包,而且我没有为这个简单的应用程序使用包。

4

1 回答 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 实体的任何属性。对于每个父类实体,您必须创建自己的序列化配置文件。

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

于 2019-08-29T09:15:02.083 回答