【问题标题】:How to setup access control for the user in symfony?如何在 symfony 中为用户设置访问控制?
【发布时间】:2020-03-11 09:58:58
【问题描述】:

我有一个 users 表,其中角色字段包含 ["ROLE_SUPERUSER"]

现在我有两个网址:

  • localhost:8000/api/en/login
  • localhost:8000/api/en/test

当用户成功登录时,它会生成一个cookie。如何将访问控制设置为第二个 URL,如果未设置 cookie,则不允许此 URL。

我在security.yaml 文件中添加了以下几行

access_control:
 - { path: ^/api/{locale}, roles: IS_AUTHENTICATED_ANONYMOUSLY }
 - { path: ^/api/{locale}, roles: ROLE_SUPERUSER}

但这没有用。

有什么帮助吗?

【问题讨论】:

    标签: php symfony symfony4


    【解决方案1】:

    access_control 中采用第一个匹配设置。因为您的模式都匹配,所以所有用户都是IS_AUTHENTICATED_ANONYMOUSLY。 您必须为防火墙使用单独的路径/模式来授权不同的角色:

    access_control:
     - { path: ^/api/{locale}/secured, roles: ROLE_SUPERUSER}
     - { path: ^/api/{locale}, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    
    

    您可以在文档中找到更多信息: Symfony - How to restrict Firewalls to a Request

    【讨论】:

      【解决方案2】:

      防火墙将采用第一个匹配的路由并应用限制。

      不想对登录路径应用一些防火墙限制,因此可以将其从列表中排除。

      我不能 100% 确定防火墙中的 {locale} 是否会起作用,这与路由描述不同。但是,您可以使用 RegEx 在 ^/api/<anything>/test 上定义规则:

      access_control:
       - { path: ^/api/.*?/test, roles: ROLE_SUPERUSER }
      

      【讨论】:

      • 感谢@Cid,它成功了。还有一个问题。我有很多路线,例如测试。那么应该用什么来代替 test - { path: ^/api/.*?/*, roles: ROLE_SUPERUSER }
      • access_control: - { 路径:^/api/.*?/login,角色:IS_AUTHENTICATED_ANONYMOUSLY } - { 路径:^/api/.*?/*,角色:ROLE_SUPERUSER }
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2018-06-04
      • 2019-10-26
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多