无论我在哪里尝试实施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]
任何人都知道如何解决这个问题?
答案 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时忽略了我的包定义,并尝试从我自己的服务器加载文件,而这些文件不存在。