2

我目前的项目几乎所有路线都受form_login.

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

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

配置(security.yml):

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

1 回答 1

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's 表达式:

    access_control:
        - { path: ^/login,                access: 'isAnonymous()' }
        - { path: ^/user/forgot-password, access: 'isAnonymous()' }
        - { path: ^/,                     access: 'isAuthenticated()' }
    
于 2013-03-02T09:50:44.480 回答