Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2中的私有图像_Php_Security_Symfony - Fatal编程技术网

Php Symfony2中的私有图像

Php Symfony2中的私有图像,php,security,symfony,Php,Security,Symfony,我的Symfony安装有点问题。在我的应用程序中,用户可以将图像上传到服务器,图像存储在/web/uploads/images中。我希望图像只对登录到应用程序的用户可见 我试图修改安全配置,但没有找到解决问题的正确配置。有什么想法吗 谢谢:)图片应该位于/web目录之外,否则网站的访问者将始终能够下载它们。例如,您可以创建/private目录并将所有图像上载到该目录 要向用户显示图像,您应该创建一个,其中将包含以下内容(但不相同): 创建扩展后,您应该能够在视图中使用如下内容: {{image\

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

我试图修改安全配置,但没有找到解决问题的正确配置。有什么想法吗


谢谢:)

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

要向用户显示图像,您应该创建一个,其中将包含以下内容(但不相同):

创建扩展后,您应该能够在视图中使用如下内容:

{{image\u private(image.name)}


我还没有找到这方面的捆绑包,所以如果您创建了一些好的解决方案,那么如果您从中创建了一个捆绑包并将其发布到网站上,这可能会很有用。

首先,将上载的图像移出web根目录

将文件夹隐藏在可公开访问的web目录中比从非公开位置将文件流式传输给用户要困难得多


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

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

很快,我将需要通过和url从移动应用程序访问私有图像,因此,出于这个原因,我实现了一个控制器,而不是一个细枝扩展,控制器的代码如下:

<?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);
    }
}
?>


谢谢

我以前也回答过类似的问题。看看这里-如果用户希望在例如
ArticleController
GalleryController
等中看到图像,该怎么办。?这意味着在每个
控制器内都有一个
操作
用于显示图像。用
Twig extension
解决这个问题是一个更优雅的解决方案。一个
Twig extension
不能处理访问控制,这就是我的目标。最好创建一个可以从任何控制器调用的图像验证服务,并使用一个细枝模板来显示图像