Symfony2中的私有图像

时间:2014-04-23 18:54:08

标签: php security symfony

我的Symfony安装有点问题。在我的应用程序中,用户可以将图像上传到服务器,图像存储在/ web / uploads / images中。我希望该图像仅对已登录用户可见。

我曾尝试修改安全配置,但我找不到合适的配置来解决问题。有什么想法??

谢谢:)

3 个答案:

答案 0 :(得分:2)

图片应位于/web目录之外,否则网站访问者将始终能够下载它们。您可以创建例如/private目录并在那里上传所有图像。

要向用户显示图片,您应该创建一个Twig extension,其中包含类似的内容(但不一样):How can I allow a user to download a file which is stored outside of the webroot?

创建扩展程序后,您应该可以在视图中使用以下内容:

{{ image_private(image.name) }}

我还没有为此找到一个捆绑包,所以如果您创建了一个很好的解决方案,如果您从中创建了一个捆绑包并在knpbundles网站上发布它可能会很有用。

答案 1 :(得分:2)

首先,将上传的图像移出Web根目录。

在一个可公开访问的网页目录中隐藏文件夹要比从非公开场所将文件流式传输给用户要困难得多。

其次,创建一个新路由或控制器,验证用户对上传图像的访问权限,如果凭据匹配,则直接从控制器操作流式传输非公共文件夹中的文件,不返回任何模板。

答案 2 :(得分:2)

首先非常感谢您花时间回答:)我认为这两种解决方案都是有效的。在我的特定情况下,我已经实现了@Patrick提出的解决方案。

即将推出我需要通过移动应用程序和网址访问私有图片,因此我实施了一个控制器而不是枝条扩展,控制器的代码如下:

<?php

namespace Company\Bundle\nameBundle\Controller;

use Symfony\Component\HttpFoundation\Response,
Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DashPrivateImageController extends Controller
{
    public function getImageAction($imagetype, $imagename) {

        $securityContext = $this->container->get('security.context');

        if ($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')) {

            if ($imagetype == 1) 
                $path = $this->get('kernel')->getRootDir() . "/../private/documentFolder1/" . $imagename;
            else 
                $path = $this->get('kernel')->getRootDir() . "/../private/documentFolder2/" . $imagename;

            $file = file_get_contents($path);
            $headers = array('Content-Type' => 'image/jpeg', 
                       'Content-Disposition' => 'inline; filename="'.$imagename.'"');
            return new Response($file, 200, $headers);
        } else 
            return new Response("not found", 404);
    }
}
?>

谢谢!