Symfony 2.3 / FOSUserBundle:即使路由不匹配,也会重定向到登录页面

时间:2013-11-30 16:29:35

标签: symfony routing fosuserbundle

我为Symfony 2.3.x安装了FOSUserBundle,因为我想创建一个用户需要登录的“安全”区域。

我设置security.yml,如下所示:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

    firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                csrf_provider: form.csrf_provider
            logout:       true
            anonymous:    true

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/, role: ROLE_ADMIN }

这很好用。如果用户未登录,我希望将/admin/*的所有请求重定向到登录页面,即使路由不匹配也是如此。

在当前设置中,匹配的路由被重定向到登录页面。如果路线不匹配,则会显示错误页面。

有人能指出我如何实现上述功能吗?

2 个答案:

答案 0 :(得分:2)

此配置应该适合您:

firewalls:
      admin:
            pattern:  /admin(.*)
            context:  user
            form_login:
                 provider:       fos_userbundle
                 login_path:     /admin/login
                 use_forward:    false
                 check_path:     /admin/login_check
                 failure_path:   null

答案 1 :(得分:0)

由于没有真正简单的symfony安全解决方案(AFAIK),我已完成以下操作以获得所需的功能。

第1步:贪婪路线 在services.yml中,我添加了一个贪婪的路径到文件的底部(所以最后读取)。这条贪婪的路线模仿了路线的存在(即使它实际上并不存在)。此路由确保来自/ admin的所有请求(/ admin / login,/ admin / login_check和/ admin / logout除外)都被重定向到自定义重定向控制器。

此路由位于routing.yml文件的底部,因此如果存在与现有路由匹配的路由,则不会将其重定向到RedirectController,而是重定向到特定于该路由的控制器。

admin:
pattern: /admin/{var}
requirements:
    var: "^(?!(login|login_check|logout)$).*"
defaults: { _controller: UserBundle:Redirect:index }

第2步 确保登录所需的路由可用于security.yml中的IS_AUTHENTICATED_ANONYMOUSLY(白名单)。

access_control:
    - { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/logout$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: "^/admin", roles: ROLE_USER }

第3步 由于不存在的路由始终与步骤1中的贪婪模式匹配,因此我可以在用户登录时将所有内容重定向到自定义404页面。这就是我在RedirectController中所做的事情。

这种方法适合我,但它不是最优雅的方式。假设我在贪婪路线之后放置路线,它们永远不会匹配。这对可测试性不利。

如果有人有更好的想法,请分享:)

到目前为止,特别感谢enigma,我从你评论中的想法中找到了这个解决方案。