MODxでPDFファイルを認証付にする

結局はFileDownloadPluginを使うことにしました。

今のところ、MODXが管理する各ページなら、会員限定などのアクセス制限はMemberCheckなどのスニペットを利用して容易にかけられる。問題は、MODxが直接は管理しないPDFファイルなどの場合には、ブラウザからの直リンクにより、アクセス制限なしで閲覧可能になることである。そこで、どうするか。.htaccessの機能ではうまく機能しない場合があるようだ。そこで、Webサーバーの範囲外にPDFファイルを置き、PHPスクリプトで閲覧させるようにし(下手すると穴が開くのに要注意)、スクリプトはMODxでのアクセス制限にかかるようにする。というのが、一案。
具体的には、
会員限定ページ中にpdfファイルを参照するページへのリンクを設定。ユーザーがその参照ページへのリンクを押すと想定している。
参照ページは会員限定の設定がなされ、1pdfファイルにつき1ページ。これが呼ばれると、当該pdfファイルをユーザーに返す。

(PHP)PHPでファイルをダンロード(アクセス制限付き) : 3流プログラマのメモ書き
PHP TIPS Vol.5
[php]会員制サイトで特定のディレクトリ内をアクセス制限する | PLUS
特定のディレクトリとファイルのアクセス制限(PHP,Apache) - Linux Square - @IT

ログイン状態の時だけファイルをダウンロードできる様にするには? – MODX JAPAN 日本公式フォーラム直接の答えではないですが、先月のオープンソースカンファレンスで発表した内容に「画像にMODxの認証をかける」というサンプルがありました。
これを応用することで圧縮ファイルも同じような認証をかけることができると思います。
発表に使った資料はこちらです。
http://osc2010.modx.ayd.jp/OSC2010Tokyo … eminar.pdf
また、以下がサンプルで用意されたサイトです。
http://osc2010.modx.ayd.jp/

上記の手順は、
サンプル1「画像にも認証を」
MODxではWebユーザで認証しないと対象のドキュメント(リソース)を閲覧できない設定を行うことが可能です。
この認証はMODxのリソースのみが対象で、サーバにアップされている画像は認証なしで閲覧することが可能です。
それだと何かと都合が悪い事があるかもしれないし、画像へのアクセスにもMODxの認証が機能するようにならないか。
というわけで作ってみました。
[利用する機能]
・mod_rewrite(apacheのモジュール)
・スニペット
・プラグイン
[画像認証処理の流れ]
1)画像のURLをMODxのリソースのURLに変換するルールを作成(mod_rewrite)

2)MODxが認証確認※NGの場合はエラー画面に遷移

3)画像パス確認、 MIMEタイプ確定(スニペット)

4)画像を読み込む(プラグイン)

5)MODxが画像を出力
[設定]
1)認証させたい画像を保存するディレクトリを決定する。
/home/modxdemo/site/osc2010/htdocs/assets/images/memimg/
ここのassets/images/memimg/ が公開ディレクトリ
2) .htaccess にmod_rewrieの設定。
# Image Authentication
RewriteRule ^assets/images/memimg/(.*)$ index.php?q=img_out.html&img=$1 [L,QSA]
ここのimg_out.htmlでアクセスできるリソースを後で作成する。
画像のパスはGET変数imgに渡される。
3)リソースの作成
リソース名:画像認証
エイリアス:img_out
 画像のURLはこのエイリアスにわたるように書き換えられる。
使用テンプレート:(blank)だとテンプレート変数の設定ができないため、中身のないテンプレートを作って指定する事をお勧めする。
本文:[!ImgAuth!]
リッチテキストエディタ(TinyMCE)を使用すると思わぬHTMLタグが挿入され
るため、エディタの使用を無効にする。
ページ設定では、公開 チェック、リソースタイプ ウェブページ、コンテントタイプ text/html、リソースの出力 ブラウザ内に通常出力、コンテナとして扱う ノーチェック、リッチテキストで編集 ノーチェック、検索対象に含める チェック、キャッシュ制御を行う ノーチェック、更新時にキャッシュを削除 チェック
4)スニペットの作成
スニペット名:ImgAuth
スニペットコード
sendForward($modx->config[‘error_page’]);
}
$img=realpath($path . $_GET[‘img’]); // 画像パスの確定//画像のパスを確定し、パスの整理
//ファイルの存在確認
if(! is_file($img) ){
$modx->sendForward($modx->config[‘error_page’]);//画像が実際に存在しなければエラーページに飛ばす。
}
//MIMEの確定
if( preg_match(‘/.(.*?)$/’,$img,$m) ){//画像によってMIMEタイプを変更。対応拡張子は“jpg(jpeg)/gif/png”
$ext=$m[1];
if( in_array($ext,array(‘jpg’,’jpeg’,’gif’,’png’)) == true ){
if( $ext == ‘jpg’ ){$ext=’jpeg’;} //.jpg の場合の微調整
}else{
$ext= ”;
}
}else{
$ext=”;
}
if( $ext != ” ){
$mime = ‘image/’.$ext;
}else{
$mime = ‘application/octet-stream’;//拡張子が判定できない場合は「application/octet-stream」にする
}
return $mime . “t” . $img; // 出力 スニペット最終出力は[MIME][TAB][画像パス]画像出力はプラグインで。
?>

5)プラグインの作成
プラグイン名:画像出力
プラグイン設定で、プラグインに渡す変数を指定できる。最初は以下のように入力。
&target=変換対象リソース;string;
パラメータ表示の更新のところ、パラメータとして 変換対象リソース とあるところの値に、画像認証用に作ったリソースのIDを指定
システムイベントとして 「OnWebPagePrerender」 をチェック
プラグインコード
//指定ドキュメントのときだけ実行
if( $modx->documentIdentifier == $target ){//$targetにプラグイン設定のデータが渡ってきている。
//$targetに設定された数字と同じリソースIDの時だけ実行
$img = explode(“t”,$modx->documentOutput);//前述のスニペットによって以下のデータが保存されている。[MIME][TAB][画像パス]
//ヘッダの調整
header(‘Content-Type: ‘ . $img[0] . ‘; charset=’ . $modx->config[‘modx_charset’],true);
//画像出力
$modx->documentOutput = file_get_contents($img[1]);
//画像データをMODx最終的な出力変数$modx->documentOutputへ保存。
}
これらの設定により、以下のURL以下に保存した画像はすべて
MODxを経由して出力されることになります。
http://osc2010.modx.ayd.jp/assets/images/memimg/
ただし、この状態ではまだ誰でも閲覧できてしまいます。次に画像認
証用に作成したリソースの「所属グループ」の設定を行い、公開を限
定させれば、Webユーザで認証していないアクセスは閲覧を拒否する
ことができます。
「所属グループ」の設定はMODxの標準機能でもあるので、ここでは
詳しい設定方法は省略します。
サンプルサイトでは実際に「所属グループ」の設定まで行っており、
アクセスするには認証が必要です。
・サンプル01
http://osc2010.modx.ayd.jp/sample01.html
ちなみに…
画像のアップは
いつもどおりで
OK。
[さらなる改良]
● 画像へアクセスしたユーザの統計をとる
● 指定回数のアクセスで画像の自動削除
● 画像だけに限らず、pdfやdocファイルにも
適用できる

参考サイト
MODx | CMS Box Blog

コメントを残す