3

我为两种类型的用户使用了两个具有相同模式的防火墙:

  • 可以访问前端和后端的管理员,他们可以在前端应用程序中看到一些额外的控件,然后是普通用户。
  • 只能访问前端的用户。

这是我的简化security.yml配置:

firewalls:
    admin:
        pattern: .*
        form_login:
            login_path: /admin/login
            check_path: /admin/login
        logout:
            path:   /admin/logout
        ...

    front:
        pattern: .*
        form_login:
            login_path: /user/login
            check_path: /user/login-check
        logout: true
        anonymous: true
        ...

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


access_control:
    - { path: ^/admin/, role: ROLE_ADMIN }
    - { path: ^/admin/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/user/login, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/user/profile, role: ROLE_FRONTEND_USER }
    - { path: ^/user/upload-photo, role: ROLE_FRONTEND_USER }
    ...

问题是,当任何未登录的用户尝试访问时,例如/user/profile,他们会被重定向到/admin/login. 我猜这是因为两者之间没有联系firewallaccess_control所以 Symfony 无法知道用户是否尝试访问部分ROLE_FRONTEND_USERROLE_ADMIN然后进行相应的重定向。

我的问题是,有什么优雅的方法可以解决这个问题吗?也许使用事件侦听器并手动检查拒绝的权限是否需要请求的 URLROLE_FRONTEND_USERROLE_ADMIN角色?

4

1 回答 1

0

您可以手动设置用户将被重定向的 url:

front:
    pattern: .*
    # ...
    access_denied_url: /user/login

匿名用户将被重定向到预期的登录路由,而不需要每个防火墙的特定模式。

希望这能解决您的问题。

于 2016-02-24T15:33:50.937 回答