symfony 中的资产文件在防火墙后面?

Posted

技术标签:

【中文标题】symfony 中的资产文件在防火墙后面?【英文标题】:Assetic files in symfony are behind the firewall? 【发布时间】:2012-08-22 07:29:55 【问题描述】:

我有这样简单的登录页面和安全设置:

firewalls:
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
            use_referer: true
            always_use_default_target_path: true
            default_target_path: /
        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: ^/, role: ROLE_ADMIN 

在我的 base.html.twig 文件中有

% stylesheets '@BrStgCcBundle/Resources/public/css/bootstrap.css' %
    <link rel="stylesheet" href=" asset_url " />
% endstylesheets %

并且仅当我在 app.xml 中获得授权时才包含这些文件。所以登录后系统会找到这个资产,但之前没有,当我按照资产生成的链接时,我被重定向到登录页面。

在视图中,链接如下所示:

<link rel="stylesheet" href="/app_dev.php/css/026adfc_bootstrap_1.css" />

此文件存在于驱动器上,当登录时调用时,未登录时显示正确的 CSS,它会将我重定向到登录页面。

【问题讨论】:

【参考方案1】:

我还发现,如果添加到 security.yml,这会有所帮助:

firewalls:
    dev:
        pattern:    ^/(_profiler|_wdt|css|js|assets)
        security:   false

【讨论】:

你一开始就不应该从security.yml 中删除它。 :P 注意:防火墙下的 dev 部分需要在 main 部分之前或任何您为安全起见的部分之前【参考方案2】:

这是正常的。您是说根目录下的所有内容(模式:^/)都位于主防火墙之后,并且要访问这些文件,您需要成为管理员(路径:^/,角色:ROLE_ADMIN)。所以需要另外设置一条规则,说css目录可以匿名访问:

-  path: ^/css, role: IS_AUTHENTICATED_ANONYMOUSLY 

【讨论】:

这是一个蹩脚的解决方案。使用另一个答案中建议的dev 防火墙。 这是错误的,问题的真正解决方案是 Bartosz Rychlicki 的回答

以上是关于symfony 中的资产文件在防火墙后面?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 3,一个应用程序中的 2 个防火墙

Symfony2 中的多个动态防火墙和 CAS 服务器

Symfony 4 - 安全性 - 从多个防火墙相互共享上下文

symfony:在多个防火墙中模拟用户

Symfony2 子域防火墙在生产服务器上被忽略

symfony 2 在防火墙检查之前在事件监听器中添加角色