Symfony 5:用于访问的防火墙和访问控制

问题描述

我正在设计具有以下端点的 API:

/album/{identifier}

要访问此端点,用户应该完全通过身份验证并以专辑所有者的身份访问,或者拥有在查询字符串中传递的有效邀请代码

我似乎无法通过防火墙、访问控制和投票者来实现这一点。看来我只能完全匿名访问,但可以使用邀请码或用户作为完全身份验证的成员。

我的防火墙如下:

    firewalls:
        login:
          pattern: ^/login
          methods: [POST]
          stateless: true
          anonymous: true
          provider: user_provider
          json_login:
        ...
        album:
          methods: [GET]
          pattern: ^/album/%identifier_regex%
          stateless: true
          anonymous: lazy 
        api:
          pattern: ^/
          stateless: true
          provider: jwt
          guard:
              authenticators:
                  - lexik_jwt_authentication.jwt_token_authenticator

我需要在此处包含专辑端点,以便它不会被大多数其他端点需要的 jwt 身份验证器阻止。

我也对这里的防火墙规则和访问控制列表的需要感到有些困惑。在我看来,我应该能够用防火墙规则单独配置所有这些,而我只是用访问控制规则复制它

然后我有访问控制列表:

access_control:
    - { path: ^/login,roles: IS_AUTHENTICATED_ANONYMOUSLY,methods: [POST] }
    - { path: ^/album/%identifier_regex%,methods: [GET] }
    - { path: ^/,roles: IS_AUTHENTICATED_FULLY }

最后,我的控制器中有一个投票者,它将检查用户是否是相册的所有者,或者他们是否拥有可以访问的相册的有效邀请码。

然而,通过上面的配置,即使他们已经登录并通过身份验证(他们有一个 JWT),token->getUser() 总是返回一个匿名用户。如果我更改配置并删除防火墙下的“相册”匹配器,它将对经过身份验证的用户完美运行,但匿名用户当然会被 JWT 防护阻止。

肯定有可能让经过身份验证和未经身份验证的用户都可以访问资源吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)