特定のユーザー役割のみがアクセスできるビューページがあります。このユーザーロールには、「プライベートファイルの表示」および「ドキュメント:ファイルのダウンロード」( ファイルエンティティモジュール からアクセス)する権限もあります。ビューページには、プライベートファイルディレクトリにあるすべてのプライベート.pdfファイルのテーブルが表示されます。 Views PHP フィールドを使用して、このテーブルに列を追加します(少なくともプロトタイピング用)。ファイル名の横に対応するダウンロードリンクが表示されます。上記のように、テーブルを表示できるすべてのユーザーは、プライベートファイルを表示し、ドキュメントをダウンロードする権限も持っているため、これは実行可能であり、セキュリティの問題ではありません。
ここでは、fixedプライベート.pdfファイルへのダウンロードリンクを常に表示したいとします。たとえば、ファイルIDは_$fid=17
_です。 Drupalでのファイルの操作 によれば、
いったん設定すると、プライベートディレクトリに保存されているファイルには、直接リンクを介してアクセスできなくなります。ただし、Drupalがファイルへのリンクを作成する場合、そのファイルは、リンクを見ることができるすべてのユーザーがアクセスできます。
「if Drupalがファイルへのリンクを構築する」とはどういう意味ですか?ユーザーがアクセスできる場合、file_create_url()
が直接リンクを作成することを何度も読みましたプライベートファイルを表示するには、ユーザーをプライベートファイルに移動します。そのため、ビューPHPフィールドを出力コードとして試しました
_<?php
$fid = 17;
$file = file_load($fid);
$uri = $file->uri;
$url = file_create_url($uri);
print l(t('Link'), $url);
?>
_
リンクが正しく表示されます(mysite.com/system/files/Name_Of_Private_File_17.pdfを参照)。ただし、ユーザーがプライベートドキュメントファイルを表示およびダウンロードする権限を持っている場合でも、リンクをクリックすると、「アクセスが拒否されました。このページへのアクセスは許可されていません。」
誰かが正しい回避策を教えてくれますか?
「ファイル:ダウンロードリンク」フィールドをビューに追加すると、正常に機能します。
「ファイル:ダウンロードリンク」のビューフィールドハンドラには、アクセスをチェックする次のスニペットがあります。
if (!file_entity_access('download', $file)) {
return;
}
そして、このスニペットは、ダウンロードリンクのURIを構築します。
$uri = file_entity_download_uri($file);
File_entity_download_uri()のコード:
function file_entity_download_uri($file) {
$uri = array(
'path' => "file/{$file->fid}/download",
'options' => array(),
);
if (!variable_get('file_entity_allow_insecure_download', FALSE)) {
$uri['options']['query']['token'] = file_entity_get_download_token($file);
}
return $uri;
}
返される$ uriのオプションクエリキーに追加されるダウンロードトークンを示します。
これをPHPコードフィールドに追加します。
<?php
$fid = $row->fid;
$file = file_load($fid);
if (file_entity_access('download', $file)) {
$uri = file_entity_download_uri($file);
print l(t('Download'), $uri['path'], array('query' => $uri['options']['query']));
}
?>
プライベートファイルへのダウンロードリンクが表示されます。