Symfony2中具有相同模式的多个安全防火墙

时间:2016-02-22 18:45:49

标签: php symfony symfony-security

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

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

这是我简化的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的部分,然后相应地重定向。

我的问题是,有没有优雅的方法来解决这个问题?也许使用事件监听器并手动检查被拒绝的权限,请求的URL是否需要ROLE_FRONTEND_USERROLE_ADMIN个角色?

1 个答案:

答案 0 :(得分:0)

您可以手动设置用户重定向的网址:

EXECUTE sp_addrolemember 'db_ddladmin', [serviceaccount]

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

希望这能解决你的问题。