如何在 API 平台中进行单个端点操作 public?

How to make a single endpoint operation public in API Platform?

在 API 平台中,我用 JWT 保护了所有端点,但我想要 POST 用户 public 以便用户可以自行注册。

如何在实体级别执行此操作?

#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ApiResource(
    collectionOperations: [
        'get',
        "post" => ["security" => "is_granted('PUBLIC_ACCESS')"], //this does not work
    ],
    itemOperations: [
        'get'
    ],
)]
class User implements UserInterface, PasswordAuthenticatedUserInterface
{

如果我在 security.yaml 中像往常一样在 Symfony 中实现它,它就可以工作

access_control:
        - { path: ^/docs, roles: PUBLIC_ACCESS } # Allows accessing the Swagger UI
        - { path: ^/authentication_token, roles: PUBLIC_ACCESS }
        - { path: ^/users, roles: PUBLIC_ACCESS, methods: POST }
        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

我只是想知道是否可以在实体级别使用注释来完成。

Api-平台安全规则在Symfony 的安全访问规则之后处理。

因此,如果 Symfony 的访问规则比 Api- 平台的规则更严格,则这些规则适用并且请求将被拒绝。

如果反过来(security.access_rules 声明端点“打开”,但在您的资源配置上您声明了更严格的 is_granted() 配置),它会起作用,从那时起请求将通过 Symfony 防火墙并到达 Api-平台访问侦听器。

为了能够使用 attributes/annotations 配置安全性,那么安全性配置需要比 Symfony 防火墙上的更严格。

例如将 / 设置为 PUBLIC_ACCESS,然后在每个资源上使用相应的 is_granted() 配置 security