我的问题如标题所示。
在我的项目中,我尝试将 HTTPS 添加到 /login 和 /admin 路由。两条路由均从第三方捆绑包导入:从 FOSUserBundle 登录,从 EasyAdminBundle 进行管理。为了实现这一点,我将
requires_channel: https
添加到 security.yml
文件中,就像此线程中描述的那样 https://symfony.com/doc/current/security/force_https.html。
access_control
部分看起来像:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN, requires_channel: https }
我通过内置服务器启动了该网站,以检查它是否会强制 https 连接,确实如此。显然有一个错误,因为 symfony 内置服务器不支持 ssl 连接,但地址栏中有
https://
。我将此版本上传到服务器,并且想继续开发下一个功能,因此我删除了 requires_channel
条目,但是当我通过键入 php bin/console server:start 0.0.0.0:80
并在浏览器地址栏中键入 localhost/admin
启动页面时,交响乐仍然强制https。我的下一个猜测是将 requires_channel: https
更改为 requires_channel: http
但这也不起作用。
requires_channel
被删除或设置为 HTTP 时,仍然强制执行 HTTPS,但我可以忍受这一点,因为最终我将不得不生成证书并在 apache 配置文件中启动 ssl 连接,但我无法在开发版本上工作。
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_email
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%router.request_context.scheme%" }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN, requires_channel: "%router.request_context.scheme%" }
终于我找到了解决问题的方法。
由于我怀疑系统和浏览器缓存中有一些数据,尽管我正在清除 symfony 缓存,但在
https://
和 login
路线上仍然存在一些强制 admin
。
对于 symfony 4.4: 我创建了一个文件 .env.local.php 并在我的本地计算机上添加了该文件:
return array('APP_CHANNEL' => 'http');
在我的生产服务器上,我有相同的文件,但用“https”代替。当然这个 .env.local.php 文件会被 git 忽略。
然后在我的 security.yml 文件中添加:
access_control:
- { path: ^/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: '%env(APP_CHANNEL)%' }
- { path: ^/portal, roles: ROLE_USER, requires_channel: '%env(APP_CHANNEL)%' }
我现在可以简单地控制我的开发/生产环境是否必须使用 https。重定向是在 .htaccess 文件中完成的,该文件也被 git 忽略,因此它不会被发送到我的生产服务器。 但我仍在学习,所以可能有更好的方法。干杯。
开发中没有改变的问题 - 清除 symfony 缓存。
至于选择 https:// 或不选择,请尝试使用“%parameter%”,它在我的routing.yml 文件中当然有效 -
schemes: ["%httpProtocol%"]
,在parameters.yml.dist 文件中设置 - 只需确保设置它在现场/制作中使用“https”
`.
扩展阿利斯特·布尔曼的答案。
而是使用“router.request_context.scheme”参数,以便您的整个 symfony 应用程序具有正确的方案。
最终结果将是:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: "%router.request_context.scheme%" }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN, requires_channel: "%router.request_context.scheme%" }
还将方案添加到您的路线中:
main:
type: annotation
schemes: "%router.request_context.scheme%"
resource: '../src/Application/Controller/'
我也遇到了同样的问题,首先将
requires_channel: https
放入 security.yml
然后将其删除,当我连接回 http://localhost/app_dev.php/admin
时,它仍然强制我使用 https
并给我带来 403 错误并禁止访问......即使我手动删除了“s”。我做了一个php bin/console cache:clear
,重新启动XAMPP,但仍然是同样的问题。但对于其他浏览器(例如 Safari),http
工作得很好。 URL 的指令实际上存储在 Chrome 浏览器缓存中,因为它具有 Symfony 定义的 TTL。所以只需删除浏览器缓存即可。
可能已经晚了,但我希望这对某人有用。我刚刚在我的开发环境中遇到了同样的问题,并找到了一个解决方案,只能在本地开发环境中使用。
只需使用
symfony serve --allow-http
执行您的 Symfony 应用程序