security.yml requires_channel似乎被忽略了

时间:2013-12-04 10:33:36

标签: symfony https

使用Acme应用程序进行基本的symfony安装,我已将/app/config/security.yml更改为强制https用于登录表单:

access_control:
    - { path: ^/demo/secured/hello/admin/, roles: ROLE_ADMIN }
    - { path: ^/demo/secured/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

然后当我请求登录表单时:http://localhost/app_dev.php/demo/secured/login我没有被重定向到https。根据以下文档,预计会重定向到https:http://symfony.com/doc/current/cookbook/security/force_https.html

也许我需要删除缓存,但请求http://localhost/app_dev.php/demo/secured/login?refresh=123也不会将我转发给https。

3 个答案:

答案 0 :(得分:2)

前几天我有类似的需求,我不得不改变routing.yml档案。这就是我解决它的方法:

的routing.yml

fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"
    schemes: [https]

虽然我确实使用了FOSUserBundle,但这应该适用于任何路由配置....

答案 1 :(得分:2)

如果上面的问题没有显示access_control声明的全部,那么这是另一个可能的解释:

如果access_control声明按此顺序出现......

access_control:
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

...并且url是http://foo.com/login,然后RequestMatcher.matches()将停止在“^ /”之后搜索声明,因为preg_match报告“^ /”匹配“^ / login”。然后使用的协议将是 http

但如果声明被撤销......

access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }

...然后RequestMatcher.matches()将在“^ / login”之后停止搜索声明,然后使用的协议将是 https

答案 2 :(得分:1)

您也可以通过注释(即)

来完成此操作
@Route("/checkout", name="cart_checkout", schemes={"https"})