【问题标题】:Private images in Symfony2Symfony2 中的私有镜像
【发布时间】:2023-03-28 11:54:01
【问题描述】:

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

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

谢谢:)

【问题讨论】:

标签: php security symfony


【解决方案1】:

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

即将推出,我需要通过移动应用程序通过 url 访问私有图像,因此我实现了一个控制器而不是 twig 扩展,控制器的代码如下:

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

谢谢!!

【讨论】:

    【解决方案2】:

    首先,将上传的图片移出网络根目录。

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

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

    【讨论】:

    • 如果用户想要查看其中的图像,例如ArticleController、GalleryController 等,该怎么办?这意味着在每个Controller 内部都有一个action 用于显示图像。用Twig extension 解决它是更优雅的解决方案。
    • A Twig extension 不处理访问控制,这就是我的目标。最好创建一个可以从任何控制器调用的图像身份验证服务并使用 Twig 模板来显示图像
    【解决方案3】:

    图像应位于/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 网站上,它可能会很有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-06
      • 1970-01-01
      • 2020-11-28
      • 2022-06-13
      • 1970-01-01
      • 2023-01-28
      • 2021-06-29
      • 2016-05-13
      相关资源
      最近更新 更多