cakephp3でPDFに閲覧制限をかける

概要

cakephp3でpdfを外部からアクセスできないようにしたかった
でもAppControllerの使い方がいまいちわからなかったので簡易的に対応した。
普通のPHPでも使える気がする。

やったこと

pdfファイルへのアクセス制限

.htaccessに下記を書き込む

<Files ~ "\.(pdf)$">
deny from all
</Files>

書くと.pdfファイルにアクセスした際に
————–
Forbidden
You don’t have permission to access /■■.pdf on this server.
————–
と出るようになる

アクセス権限判断用セッション代入

あまり良くないき気しかしないけど今回はpdf作成時にセッションにファイル名を入れることにした。

$rand = substr(str_shuffle('1234567890abcdefghijklmnopqrstuvwxyz'), 0, 10);
$filename = $rand.'.pdf';

$file_name = microtime().'.pdf';
$_SESSION['pdf_name'] = $file_name;

ダウンロードURLを作る

適当なコントローラーにPDF生成用の関数を書いた。

public function pdf(){
	$this->autoRender = FALSE;
	$dir = "/var/www/html/";

	if (isset($_SESSION['pdfName']) && strpos($_SESSION['pdfName'],'.pdf') === false){
		die('このファイルにアクセスする権限がありません');
	}
	if(! file_exists ( $dir . $_SESSION['reportPdfName'] )){
		die('PDF作成に失敗しました');
	}
	header("Content-Type: application/pdf");
	readfile( $dir . $_SESSION['reportPdfName'] );
}

これでこの コントローラー/pdf にアクセスするとPDFが見られるようになった。