Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 2.3/FOSUserBundle:即使路由不匹配,也重定向到登录页面_Symfony_Routing_Fosuserbundle - Fatal编程技术网

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

Symfony 2.3/FOSUserBundle:即使路由不匹配,也重定向到登录页面,symfony,routing,fosuserbundle,Symfony,Routing,Fosuserbundle,我为Symfony 2.3.x安装了FOSUserBundle,因为我想创建一个用户需要登录的“安全”区域 I设置security.yml如下所示: security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_

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

I设置
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/*
的请求重定向到登录页面,即使路径不匹配

在当前设置中,匹配的路由将重定向到登录页面。当路由不匹配时,将显示错误页面


有人能告诉我如何实现上述功能的正确方向吗?

此配置应该适合您:

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

由于没有真正简单的symfony安全解决方案(AFAIK),我做了以下工作来获得想要的功能

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

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

admin:
pattern: /admin/{var}
requirements:
    var: "^(?!(login|login_check|logout)$).*"
defaults: { _controller: UserBundle:Redirect:index }
步骤2 确保登录所需的路由可用于security.yml中的匿名身份验证(白名单)

access_control:
    - { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/logout$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: "^/admin", roles: ROLE_USER }
步骤3 由于不存在的路由总是与步骤1中的贪婪模式相匹配,因此当用户登录时,我可以将所有内容重定向到自定义404页面。这就是我在重定向控制器中所做的

这种方法对我很有效,但它不是最优雅的方法。假设我将路由放在贪婪路由之后,它们将永远不会匹配。这不利于可测试性

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


到目前为止,特别感谢enigma,我是根据您评论中的想法得出此解决方案的。

感谢您对enigma的回复!这似乎让我更接近我想要的东西,但在这种配置中,我遇到了两个问题。1.从/admin/test到登录表单的所有内容都会被重定向到登录表单,但是如果还有一个url部分(例如/admin/test/test2),那么它就不会再重定向到登录表单,并给出一个route not found异常。2.当我被重定向到/admin/login时,我陷入了一个循环,我还不知道为什么。我已经解决了重定向循环的问题。我发现我没有正确地覆盖标准FOSUserBundle登录路由。我正在路由到/admin/login,但登录名位于/login。但是仍然存在的一个问题(我仍然无法解决)是为什么/admin/test的路由正确地重定向到登录表单,而/admin/test/other_test没有。目前我也看不到一个简单的解决方案。我猜这和模式匹配和防火墙无关,而是和路由有关。您可以制作自己的重定向控制器,可以在routing.yml文件中配置该控制器,以便在前缀
/admin
上调用,就像Symfony FrameworkBundle重定向控制器一样。上述控制器可用于继承当前行为。