Symfony2 防火墙:保护 /web 文件夹
Symfony2 Firewall: protect /web folder
我正在开发一个完全受防火墙保护的 SF2 网络应用程序:在登录之前,任何人都不应该能够看到或修改任何内容(当然,登录表单除外)。
所以这是我的 security.yml
文件的 firewall
部分:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main_login:
pattern: ^/login$
anonymous: true
main:
pattern: ^/
anonymous: false
form_login:
login_path: fos_user_security_login
check_path: fos_user_security_check
logout:
path: fos_user_security_logout
target: /
这很好用:如果我在未登录时键入 url http://mywebsite.com/app.php/article/show/1
,我将转到登录页面。
我的问题是我有一些文档和媒体文件位于 Symfony 的 web
目录(例如 myapp/web/document/myTextFile.txt
)。登录用户可以通过我的应用程序访问它们,非登录用户 也可以访问它们!
任何键入 http://mywebsite.com/app.php/document/myTextFile.txt
的人都可以下载文件...
为什么 pattern: ^/
行不阻止这种情况?默认排除 web
文件夹是因为它包含 app.php
和 js/
以及 css/
文件夹吗?
如何保护我的文档?
更新:显示受保护的图片
我尝试了 Gerry 建议的解决方案,它可以很好地保护我的文档下载。
但是,我的document
文件夹中也有图片,我想显示这些图片,直接包含在相关页面中。
例如http://mywebsite.com/app.php/article/show/1
中会有一些文字和图片myapp/app/Resources/document/AAA.jpg
,http://mywebsite.com/app.php/article/show/2
中会有一些文字和图片myapp/app/Resources/document/BBB.jpg
等.
我试着用 Assetic 来做,但它似乎是为 "static" 图片(比如顶部徽标,或不依赖于对象的图片)做的。
我看到的一个解决方案是将图像转换为 Base64 并像这样包含它:<img alt="" src="data:image/png;base64(...)" />
,但它看起来真的很丑...
我现在没有有效的 Symfony 安装,但请尝试从 Web 移动您的文档,如果防火墙会继续。
请告诉我答案,如果它不起作用,或者您将无法在生产中移动这些文件,我们将尝试找出解决方案。
Web 目录是您的 public 根目录,由网络服务器 (Apache/Nginx/...) 提供服务。
默认情况下,对现有文件的任何请求根本不会通过 Symfony,因此没有防火墙设置会阻止对驻留在 Web 根目录中的文件的访问。
干净的解决方案是将这些文件移动到另一个目录,在 webroot 之外,例如 app/Resources/uploads
。然后你可以编写一个 Symfony 控制器来下载这些文件。
我正在开发一个完全受防火墙保护的 SF2 网络应用程序:在登录之前,任何人都不应该能够看到或修改任何内容(当然,登录表单除外)。
所以这是我的 security.yml
文件的 firewall
部分:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main_login:
pattern: ^/login$
anonymous: true
main:
pattern: ^/
anonymous: false
form_login:
login_path: fos_user_security_login
check_path: fos_user_security_check
logout:
path: fos_user_security_logout
target: /
这很好用:如果我在未登录时键入 url http://mywebsite.com/app.php/article/show/1
,我将转到登录页面。
我的问题是我有一些文档和媒体文件位于 Symfony 的 web
目录(例如 myapp/web/document/myTextFile.txt
)。登录用户可以通过我的应用程序访问它们,非登录用户 也可以访问它们!
任何键入 http://mywebsite.com/app.php/document/myTextFile.txt
的人都可以下载文件...
为什么 pattern: ^/
行不阻止这种情况?默认排除 web
文件夹是因为它包含 app.php
和 js/
以及 css/
文件夹吗?
如何保护我的文档?
更新:显示受保护的图片
我尝试了 Gerry 建议的解决方案,它可以很好地保护我的文档下载。
但是,我的document
文件夹中也有图片,我想显示这些图片,直接包含在相关页面中。
例如http://mywebsite.com/app.php/article/show/1
中会有一些文字和图片myapp/app/Resources/document/AAA.jpg
,http://mywebsite.com/app.php/article/show/2
中会有一些文字和图片myapp/app/Resources/document/BBB.jpg
等.
我试着用 Assetic 来做,但它似乎是为 "static" 图片(比如顶部徽标,或不依赖于对象的图片)做的。
我看到的一个解决方案是将图像转换为 Base64 并像这样包含它:<img alt="" src="data:image/png;base64(...)" />
,但它看起来真的很丑...
我现在没有有效的 Symfony 安装,但请尝试从 Web 移动您的文档,如果防火墙会继续。
请告诉我答案,如果它不起作用,或者您将无法在生产中移动这些文件,我们将尝试找出解决方案。
Web 目录是您的 public 根目录,由网络服务器 (Apache/Nginx/...) 提供服务。
默认情况下,对现有文件的任何请求根本不会通过 Symfony,因此没有防火墙设置会阻止对驻留在 Web 根目录中的文件的访问。
干净的解决方案是将这些文件移动到另一个目录,在 webroot 之外,例如 app/Resources/uploads
。然后你可以编写一个 Symfony 控制器来下载这些文件。