Top > MyPage
 

認証のかかるところに静的なファイルを

静的ファイルを認証後に開きたい

pdfなどのファイルをログインした後にだけ、開くことができるようにしたい。

また、認証が通ったら認証前にたたいたurlに遷移させられるか。

javaはstruts + acegi、PerlはCatalyst、PHPはEthna + PEAR::Authを使うとして調べてみた。

Java(struts + acegi)の場合

strutsのアクションはMyApp/action以下となるようにしておく。acegiはフィルタとして実装するため、アプリケーションの領域で(MyApp以下)、かつaction以下ではないところにディレクトリを作成しておけば、その位置におかれたファイルに対応するurlをたたけば、認証後のみ普通にアクセスできる。

また、認証前にそのファイルのurlをたたいてもログイン画面に遷移するが、そこでログインすると、そのファイルのurlに遷移する。

Perl(Catalyst)の場合

urlがたたかれたとき、Root.pmのautoでログインしてるかチェックさせる。ログインしていなければ、ログイン画面のurlにリダイレクトさせるのである。

ここで、たたかれたurlを保持して、どこかに保持して、ログイン成功後にそこに遷移するようにしたい。

ログインしていない場合は、リダイレクトではなく、Loginにdetachさせるようにすれば、たたかれたurlの保持も簡単にできると考えたが、detachだとautoに戻ってきてしまうため、この方法は使えないことが分かった。

したがって、一工夫必要である。例えば、次のような方法でなんとかなったので、大まかに説明すると。

  • 認証していない場合、Root.pmのautoで、その時たたかれたuriを取得する。
  • リダイレクトするuriにパラメータとしてくっつける。
  • パラメータで受け取った値(uri)をログインフォームにhiddenとして入れ込む
  • ID、パスワードと一緒に、そのuriも取得して、認証が通った場合にそこにリダイレクトする

pdfなどの静的ファイルの扱いも一工夫必要である。認証のかかる位置に置くと、ファイルのurlをたたく、ということは出来ないので、ファイルをリードしてクライアントに送るアクションを作る必要がある。そのアクションへのリクエストにファイル名をいれてファイルを指定するようにすると良い。

PHP(Ethna + PEAR::Auth)の場合

この場合も、傾向はCatalystと同じである。

・認証後の遷移は、自前で何とかするしかない。

ethnaのurlマッピングは風変わりである。post先は固定であり(index.php)、そのときのリクエストに含まれるパラメータ名にアクション名が含まれるようにする。

リクエストに含まれる[action_何とか]というのがアクションをしめすパラメータである。

例えば、こんな方法がかんがえられる。

  • (認証前の場合)全てのアクションの基底になるアプリケーションのアクションクラスのfunction authenticate()内で、リクエストにふくまれるactionを取得する。
  • 取得したパラメータ名をアプリケーションに存在する全てのアクション名でチェック。そのアクション名を変数に入れてLoginアクションで拾うことが出来るようにする。
        $_POST['o_act'] = $o_act;
        
  • ログインのビューで値を拾って、hiddenにいれる。
  • ID、パスワードと一緒にhiddenの値を受け取り、値があったらそのアクションへ、値がなかったらデフォルトへ。

Catalystの場合よりも分かりづらく、かつ手間がかかる。

・静的ファイルのurlを直接たたくことは出来ないので、やはりそういうファイルをリードして、クライアントに送るアクションを作る必要がある。Perlの方は比較的簡単に出来ることだが、PHPだとちょっと難しいとおもわれる。