Symfony $ controller-> getUser()替代非安全区域?

时间:2013-03-02 02:24:11

标签: security symfony routing controller

我目前的项目几乎所有路线都受form_login保护。

两条路由/login/user/forgot_password应保持不受保护,以便未经过身份验证的用户可以访问。 有什么方法可以阻止经过身份验证的用户访问此路由吗?

在我的控制器中,我可以检查$this->getUser()但是在非安全区域security.context没有填充相应的数据。

配置(security.yml):

security:
    firewalls:
        nonsecured:
            pattern:  ^/(login|user/forgot_password)$
            security: false
        secured:
            pattern:  ^/
            # ...

1 个答案:

答案 0 :(得分:2)

如果没有活动防火墙,您将无法获取当前用户信息。以下是解决问题的方法:

  • 删除nonsecured防火墙,以便整个应用程序都被活动防火墙覆盖,
  • 通过将anonymous: ~添加到secured防火墙
  • 来启用匿名访问
  • 使用访问控制来决定谁可以到达哪里:

    access_control:
        - { path: ^/login,                roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/user/forgot-password, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/,                     roles: ROLE_USER }
    

要阻止对经过身份验证的用户访问/login/user/forgot-password,您至少有以下两个选项:

  • 检查控制器中的用户 - 您的建议方式,或
  • 使用JMSSecurityExtraBundle的表达式:

    access_control:
        - { path: ^/login,                access: 'isAnonymous()' }
        - { path: ^/user/forgot-password, access: 'isAnonymous()' }
        - { path: ^/,                     access: 'isAuthenticated()' }