2

Symfony 2 Web サイトのアップロード チュートリアルに従っており、次の場所にアップロードします。

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

これは、公開されているアクセス可能なファイルには問題ありません。しかし、特定のファイルを保護するにはどうすればよいでしょうか? たとえば、アップロード フォームでは、ユーザーはファイルを「公開」または「非公開」にすることができます。この状況をどのように処理すればよいですか?

4

1 に答える 1

7

ファイルを公に公開するのではなく、プライベートな場所 (webディレクトリの外) に保存し、バンドルとコントローラーを作成し、コントローラーにファイル 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を持つ があります。AssetsControllerserve

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
    }
}
于 2012-08-08T18:37:59.827 に答える