redirectの仕様

2007/08/07 | cakePHP

以前「redirectメソッドは使えない」という趣旨の投稿をしたが、故あってソースを読んでみた。別に「使えない」ということはなさそう・・・。
まず「別ホストへのリダイレクト」。これはhttpから始まるURL(URI)を引数で与えることで、問題なくリダイレクトできる。
問題は「同じホスト内でのリダイレクト」の中にある。例えば一つのホスト内で以下のような構成で使うような場合だ。

(1) public_html–cake(cakePHPはこちらのディレクトリの中で動作させる)
(2) public_html–misc(cakePHP関連以外のページはこちらに配置)

(1)へのアクセスはhttp://example.com/cake/。
(2)へのアクセスはhttp://example.com/misc/。

となる。ここでredirectの引数に「/cont/func」等と与える。そうするとこれは(1)のURL配下でリダイレクトされる。つまり以下のURLだ。
http://example.com/cake/cont/func

httpから始まらない(正確に言うと引数の中に「://」がない)ときはcakePHP配下でリダイレクトされるということだ。
よって(2)のようにcakePHPの配下でないページに遷移しようとする場合は、たとえ同一ホストであってもhttpから始まる正しいURLを引数として与えないといけない。

これで少しすっきりした。でも結局はphpのheader関数を使ってリダイレクトするわけだから関数の最後はexitして欲しい。exitしないのには何か理由があるのだろうか。

余談だが、このredirect関数。第2引数にhttpのレスポンスコードを入れると、リダイレクトではなく、レスポンスコードとメッセージを返してくれるようだ。ウェブアプリを作りこむ場合は、いろいろ作りこむので純粋にレスポンスコードを返すこともないとは思うのだが・・・。307とか返すときに使うのかなぁ。

cakePHPでの認証モジュール(その2)

2007/08/05 | cakePHP

sdAuthに追加開発をしてしまおうかと思ってたら、ちゃんとそういうコンポーネントが公開されてました。

obAuth

グループ管理も出来て優れもの。今後は小規模開発ならsdAuth、複数ユーザ管理ならobAuthという流れになりそうだ。
さすがにobAuthは少し複雑な流れになるので、詳しい日本語解説が欲しいところだが、ちゃんとレビューしてるサイトがありました。

TOYOSYSTEM

結構詳しく書かれてるし、足りない機能の追加とかまでしてある。
勉強になりました。

cakePHPでの認証モジュール

2007/08/04 | cakePHP

以前は認証モジュールとして「Pear::Auth」を使おうと思っていたけど、ちょっと面倒。
Pear::Authはいろいろ依存しているライブラリがあって、単純にそれだけをインストールする、ということは難しそう。tarballをダウンロードして・・・ということもできるだろうけど、使えるようにできるかどうか実証するのが面倒。
単にパスを通してしまって従来の記述方法でやるのが簡単だけど、そこはやっぱりcakePHPのお作法にそった形で使えるようにしたいので、そこまでにたどりつくには少し時間がかかりそうだ(きっと賢者がいると思うので、検索する時間くらいは確保してもいいかもしれない)。
世の中にお手軽な認証コンポーネントが公開されているので、それを使うことにした。

いちばん簡単な認証システム

cakePHPではおなじみのDozonoさん作だ。
使い方はこんな感じ。ファイルはここからダウンロード

1.まず必要なファイルをダウンロードして適切な場所に設置する。
○sd_auth.phpをcomponentsディレクトリに設置(ファイル中にユーザ名とパスワードを記述)。
○login.thtmlをlayoutsディレクトリに設置。

2.認証をかけたいコントローラーに対して以下のように記述すればよい。
var $components = array(‘SdAuth’);
function beforeFilter()
{
 if($this->SdAuth->isloggedin() == FALSE){
  $this->layout = “login”;
 } else {
  $this->layout = “default”;
 };
}

これでOK。必要に応じてログアウト処理を適切なところに書けばよい。
function logout(){
$this->SdAuth->logout();
$this->redirect(“どこか”);
}

ただ、これだけだと、この処理を書いたコントローラーでのみ認証が有効になるだけで、その他のコンポーネントにはきいてこない。全てのコンポーネントで有効にするには・・・。

cake/app_controller.phpをapp/app_controller.phpにコピーして、この中に上記を記述する。

通常はコントローラの元ファイルとしてcake/app_controller.phpを読み出すのだが、app/app_controller.phpが存在するとこちらを読むようになる。

シンプルだけど有効なコンポーネントだ。ただこのままだとユーザ1人分の認証しか出来ない。sd_auth.phpの中を覗けばわかるが、ユーザ名とパスワードが決めうちで定義されているからだ。
これを拡張すれば複数ユーザにも対応できそうな感じ。
(1) ユーザ名とパスワードを配列で定義
 これだけで複数ユーザ対応は出来そうだ。認証に成功したときにセッションにtrueを書き込むのではなく、ユーザ名を書き込んでおけばいろいろ使い回しがききそう。
(2) データベースにユーザ情報を持たせたい
 テーブル(モデル)に情報を持たせるわけだが、コンポーネントからモデルにアクセスできたっけ・・・。これが出来れば非常に簡単だ。これは後日検証してみるとしよう。

あと・・・コンポーネント中ではpostされた値に対して$_POSTでアクセスしているけど、これcakePHPっぽくしたいな。
少し時間が出来たらチャレンジしてみることにする。

Admin Routingの認証(その2)

2007/08/03 | cakePHP

以前に書いたbeforeFilter関数では「adminとしてアクセスしているかどうか」というのは、結局わからなかった。で、現状は以下のように記述している。

if(defined(‘CAKE_ADMIN’) && !empty($this->params[‘url’][‘url’]) && preg_match("/^".CAKE_ADMIN."/",$this->params[‘url’][‘url’])){

もっとスマートな記述があるようにも思うが・・・。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net