在Symfony2中使用https在任何URL上重定向循环

时间:2013-12-19 06:10:33

标签: security symfony https

无论我在哪里尝试实施https频道,都会有无限重定向循环。这就是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
                check_path: /login_check
                login_path: /login
                default_target_path:  /home
            logout:
                path:   /logout
                target: /index
            security: true
            anonymous: true
            remember_me:
                key:      mySecret
                lifetime: 604800 #seven days
                path:     /
                domain:   ~

    access_control:
        - { path: ^/js, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/css, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/index*, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin/.*, role: ROLE_ADMIN }
        - { path: ^/.*, roles: ROLE_USER }

例如,如果我将管理路径更改为:

- { path: ^/admin/.*, role: ROLE_ADMIN, requires_channel: https }

循环将发生。 同样在routing / entity.yml中,我试过这样的事情:

entity_index:
  pattern: /
  defaults: { _controller: MyBundle:Entity:index }
  schemes: [https]

任何人都知道如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,因为服务器位于反向代理后面,后者通过ssl与客户端进行通信,但http与应用程序运行的服务器进行通信。我只使用了这个,因为RP和App Server之间的连接是安全的,因为它不会离开内部网络。如果你真的很肯定你真的有SSL运行并且出现这个问题,那就有一个丑陋的解决方案......但它确实是最后的手段并且使用风险自负:

您可以像这样覆盖app.php中的服务器变量:

$_SERVER['HTTPS'] = 'on'; 
$_SERVER['SERVER_PORT'] = 443;

再次,这是一个丑陋的修复,而不是一个解决方案,只使用你唯一的风险和责任,如果我没有反向代理不转发端口的问题,我不会这样做,不是100%确定我在客户端和RP之间有SSL。不要忘记,如果你没有真正运行有效的ssl

,这会让你很脆弱

答案 1 :(得分:1)

对我来说,问题不在于Symfony,而是Nginx配置错误。如果您正在使用Nginx,请确保您没有此设置: fastcgi_param HTTPS off;否则将其设置为on并重新启动服务器。希望它有所帮助

答案 2 :(得分:0)

虽然看起来原始海报的问题是在他们的开发服务器上没有启用HTTPS的情况,但我最近遇到了类似的问题,并且我想分享我是如何解决它的。

就我而言,我的security.yml看起来像这样:

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

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username

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

    access_control:
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
        - { path: ^/dm, role: IS_AUTHENTICATED_REMEMBERED, requires_channel: https }
        - { path: ^/dm/*, role: IS_AUTHENTICATED_REMEMBERED, requires_channel: https }
        - { path: ^/*, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

就我而言,https适用于每一页,除了任何需要任何登录的内容。此外,我从谷歌cdn拉的javascript和css文件无法加载。最后,我遇到了两个代码问题:

问题1:

多次识别频道。在我的例子中,我在我的routing.yml文件中有一个指令,它指定使用http,以及上面我的security.yml文件中的指令,指定https。这意味着我的应用程序管理的路径(需要我登录的路径)被安全系统路由到https,安全系统将其发送回尝试将其更改为http的路由系统,然后将其发送回安全系统将其更改回https,无限重定向循环。通过删除routing.yml中的指令,此问题已修复。

问题2:

我错过了我的cdn配置中的一行资产:

ssl: ['https://ajax.googleapis.com/ajax/libs/']

如下所示放在config.yml中:

framework:
    #esi:             ~
    translator:      { fallbacks: ["en"] }
    secret:          "%secret%"
    router:
        resource: "%kernel.root_dir%/config/routing.yml"
        strict_requirements: ~
    form:            ~
    csrf_protection: ~
    validation:      { enable_annotations: true }
    templating:
        engines: ['twig']
        #assets_version: SomeVersionScheme
        packages:
            cdn:
                base_urls:
                    http: ['https://ajax.googleapis.com/ajax/libs/']
                    ssl: ['https://ajax.googleapis.com/ajax/libs/']

缺少此行意味着资产在使用ssl时忽略了我的包定义,并尝试从我自己的服务器加载文件,而这些文件不存在。