【问题标题】:Symfony $controller->getUser() alternative in non-secured areas?Symfony $controller->getUser() 在非安全区域的替代方案?
【发布时间】:2023-04-06 13:42:01
【问题描述】:

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

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

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

配置(security.yml):

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

【问题讨论】:

    标签: security symfony routing controller


    【解决方案1】:

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

    • 移除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()' }
      

    【讨论】:

    • 谢谢!它就像一个魅力(就像你的 BCrypt 捆绑包一样;))
    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多