サーバー上のファイルに開発した後からアクセス制限をかける方法
サーバー上のファイルに対して、クライアントからのアクセス制限をかける場合、
HTTPサーバーがファイルにアクセスする手前にプログラムを
埋め込まないといけません。
制約条件とか
通常は、クライアントにアクセス権限判断用のプログラムを呼び出す
URLを公開して、ファイル自体は直接アクセスできない場所に置くはずです。
流れで言うと
クライアント → アクセス制御プログラム呼び出し → 判定 → ファイル読み出し
です。
でも、一度運用開始したあとになると、一度公開したURLは変えられません。
なので、別の方法を検討しました。
また、静的なパスワード設定なら.htpasswdによるBASIC認証をすれば
いいだけです。
今回はxoopsの認証機能と連携したいので、別の方法を使いました。
方針
Apacheのmod_rewriteを使って、ファイルアクセスを無理やり
プログラムへのアクセスに変更して対処しました。
イメージだけで書くと
の流れを
- サーバーマシン受信
- Apache受信
- ★アドレス書換え(by apache mod_rewrite)
- プログラム読み出し
- アクセス権限チェック
- ファイル読み込み(by php)
- ファイル応答
に変えました。
認証プログラムの準備
認証プログラム自体はxoopsのログインチェックの機能を
そのまま使いました。なので、あまり解説することはないです。
checker.php
というファイルを用意しておきました。
たとえば、file#.xmlというファイルにアクセス制御をかける場合(#はデータのID)
URLをchecker.php?id=10としてアクセスすると、file10.xmlのコンテンツへの
アクセス判定をして、OKのときだけファイルを出力するだけのプログラムです。
<?php include XOOPS_URL.'/mainfile.php'; # データのID読み込み if(isset($_GET['id'])){ $myid=intval($_GET['id']); }else{ exit; } # xoopsのユーザIDをチェック if(is_object($xoopsUser)) { $uid = $xoopsUser->getVar('uid'); } else { $uid = 0; } # アクセス権限OKならファイル読み込み if(check_access_file($myid, $uid)){ $fname="./file".$id.".xml"; $type="Content-type: text/xml"; header($type); readfile($fname); } function check_access_file($myid, $uid){ # チェックプログラムをここに書く return true; } ?>
ブログ用に書き起こしたので、間違ってるかも・・・。
.htaccessの準備
RewriteEngine on RewriteRule ^file([0-9]+).xml+ checker.php?id=$1
ちなみに、データのIDは数字前提で書いてます。
この2つのファイルを置くだけで、アクセス権限を追加できました。
思ったよりカンタン!でした。
余談1
来週末から国際会議で発表する予定でして、
その準備で最近なかなか時間が取れないです。
今日も必死に原稿丸覚えしてます・・・。
余談2
先日、本のモニタープレゼント企画をやったのですが、、、色々大変です。
サイト運営のモチベーションをガツンと下げられました