【问题标题】:Symfony2 Firewall: User has right role but "Access denied"Symfony2 防火墙:用户具有正确的角色,但“访问被拒绝”
【发布时间】:2017-07-26 17:14:32
【问题描述】:

我的防火墙规则无法正常工作。我有一个角色为D-COMPLIANCEDIALOG 的用户,以及一个授予对该规则的访问权限的防火墙规则:- { path: ^/ , roles: D-COMPLIANCEDIALOG }。我仍然收到拒绝访问(访问被拒绝,用户既不是匿名用户,也不是记住我。)。

#security.yml

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
    providers:
        reddot:
            id: reddot_user_provider

    firewalls:

        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        secured_area:
            pattern: ^/
            anonymous: ~
            http_basic: ~
            simple_form:
                authenticator: reddot_authenticator
                    check_path:    login_check
                    login_path:    login

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/ , roles: D-COMPLIANCEDIALOG }

来自 symfony profiler 的用户数据:

Username    admin
Authenticated?  yes
Roles   [D-COMPLIANCEDIALOG]
Inherited Roles     { }
Token class Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken

我检查了什么:

  • 控制器没有自己的安全设置
  • 角色名好像没有错别字
  • 它确实是防火墙规则中的最后一行,如果我删除它,我确实可以访问。

【问题讨论】:

标签: symfony


【解决方案1】:

角色名称不正确。请查看文档Security - Roles

您分配给用户的所有角色都必须以 ROLE_ 前缀开头。否则,它们将不会被 Symfony 的安全系统以正常方式处理(即,除非您正在做一些高级的事情,否则将像 FOO 这样的角色分配给用户,然后按如下所述检查 FOO 将不起作用)。

我在输入“不正确”的角色名称时遇到了同样的问题,并且也被错误消息弄糊涂了。

【讨论】:

    【解决方案2】:

    虽然 Symfony suggest 在角色前面加上 ROLE_.. 您仍然可以通过 Securing by an Expression 使用自定义角色,例如:

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/ , allow_if: "has_role('D-COMPLIANCEDIALOG')"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-27
      • 2018-08-21
      • 1970-01-01
      • 2013-09-15
      • 2013-03-28
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多