保护Symfony 2中特定用户上传的内容

时间:2012-08-08 18:21:17

标签: symfony

我正在关注Symfony 2网站上的upload tutorial,我将上传到:

web/uploads/{user_salt}/{upload_unique_random_name}.ext

这适用于公共可访问文件。但是我如何保护某些文件呢?例如,在上传表单中,用户可以将文件设置为“公共”或“私有”。我应该如何处理这种情况?

1 个答案:

答案 0 :(得分:7)

我不会公开公开文件,而是将它们存储在私有位置(web目录之外),创建一个Bundle和一个Controller,并且在控制器中有一个动作需要一个文件ID并从数据库表中查找其访问级别。如果文件可公开访问,请提供服务。如果没有,请确保用户有权查看该文件。

您只需要创建一个File实体,以及一个存储针对这些文件的用户或用户角色权限的表,以便您可以根据请求对它们进行交叉检查。

它会增加一些服务文件的开销,因为需要发生完整的Symfony2请求,而直接通过apache或nginx提供文件将不会产生框架堆栈的开销。

希望我已经解释得那么好了。

编辑:

如果您通过使用令牌(例如通过电子邮件)提供这些图片,那么您可以按照以下方式执行某些操作......

示例图片src属性:http://yourdomain.com/assets/12/TOKEN

此路由配置看起来像这样(在YAML中):

assets_serve:
    pattern: /assets/{id}/{token}
    defaults: { _controller: AcmeAssetBundle:Assets:serve }
    requirements:
        _method: GET

AcmeAssetBundle中,您将AssetsController行动serve

class AssetController extends Controller
{
    public function serveAction($id, $token = null)
    {
        //fetch asset record from the database -- which also contains its file path
        //check the TOKEN matches the one stored against this image
        //set content-type headers and serve the image
    }
}