redirectのバグ?仕様?

2007/03/31 | cakePHP

認証機能の続き。

現在cakePHPと別のブログシステムとを連携してプログラムを書いている。ブログそのものに認証機能を実装して(会員専用ページのような感じ)、会員管理をcakePHPで実装した。ログインの状態はセッションで持ち回り、ログイン画面の表示はブログ側で実装してある。
ここでcakePHPでセッションの状態を確認し、ログインが確認できなかったらブログのトップページ(認証が必要)へリダイレクトする処理を実装しようと考えた(が、ここではまった)。
cakePHPのコントローラーにはredirectメソッドが用意されている。このメソッドもちょっと曲者でリダイレクト後にexitしてない、ってことでウェブ上には多くの不満の声がある。
そこはそもそも注意していたのだが・・・このリダイレクトメソッド、外部のURLには遷移できない。cakePHPのルートディレクトリ以下でしか動作しないっぽい。なくなくソースを読んでみたけど、redirectメソッドの最後のほうはこんな記述。

header(‘Location: ‘ . FULL_BASE_URL . $url);

絶対外には出れないよ。contoroller.phpを見渡してみたけど、他に遷移できそうなメソッドが見当たらない・・・。外には出れないわけね。

認証機能を組み込むには

2007/03/30 | cakePHP

コントローラごとに認証機能を使うにはどうすればよいか。

それは意外と簡単だった。当該コントローラでbeforeFilterというメソッドを書いて、そこで権限があるかどうかチェックすればいい。beforeFilterはその名のとおり、そのコントローラを実行する際に、「事前に実行されるメソッド」だ(と思う)。ここでの権限チェックを通過しなかったら、ログイン画面を表示させるような処理をすればよい。

decorate.phpおかしくないか?

2007/03/28 | cakePHP

今手元にあるdecorate.php(Revision:4597、lastmodified:2007/3/7)、データベースの接頭文字列を指定してあるとうまく動いてくれなかった。追試はしていないけれど、バグっぽい。ソースを少しだけ眺めたけど・・・、じっくり見ないとやっぱりわからない。
面倒なので接頭文字列なしにしていったん作成した後、後付で設定変更、テーブル名変更をして使うことにした。

decorate.phpは非常に便利だが、今回、自動生成したスクリプトを覗いてみて、少しイマイチだった(プログラム的にはよくわからないけど、表示させる文章にピリオドがあったりなかったり・・・そういう部分)。
コミットしてみようかな・・・。

validationのタイミング

2007/03/27 | cakePHP

データの登録や編集処理をおこなう際は当然ながらフォームを使う。フォームから入ってきたデータは、そのままデータベースに格納することもあるが、何らかの処理をしてから格納することもある。例えばパスワードをmd5してから格納する場合などだ。
ある案件でプログラムを組んでいるとき、ふと迷った。パスワードの入力制限(モデルの$validateで指定する)をなんと書けばよいのか・・・。結論からいうと以下のように書いた。

$validate=array(‘password’=>’/^[0-9a-z]{32}$/’);

半角英数小文字32文字で制限、つまりmd5した値だ。
プログラムの大枠はbake.php(実際はdecorate.php)を使って書き出したものを使った。この場合validationはsaveが呼ばれたときに実行される。saveが呼ばれ、validationに成功すると、データはそのままデータベースに格納されるので、validateとsaveの間で処理をはさむことはできない(自分でシコシコ書けば別だが)。
ただしこれだと、パスワードに入力してもらう文字を制限することはできない。だって何を入力してもmd5しちゃえば半角英数32文字になっちゃうからだ。
そこでsaveする直前に以下のような記述を書いた。

if(preg_match(‘/^[0-9a-z]{8}$/’,$this->data[‘Member’][‘password’]){
  $this->data[‘Member’][‘password’]=md5($this->data[‘Member’][‘password’]);
}else{
  $this->data[‘Member’][‘password’]=”;
}

「半角英数8文字以外が入力されたら空文字列にする」。「これだったら結局モデルでは制限かけなくても一緒かも」とも思ったけど、この方が余計なプログラムを書く手間が省けるので書いておくことにした。

結局decorate.phpで作成したスクリプトを流用して、立派なユーザ管理画面ができた。便利!。

Serendipityのプラグインを作る

2007/03/25 | SNS/CMS/ブログ

仕事でSerendipityを使っている(使い始めた)。しかしまだブログツールの領域は出ていない(ポータルにまでは至らない)。それでも、素人さんのクライアントさんにはこの程度でも十分な場合も多い。
今回Serendipityで作っているサイトに認証機能を導入することになった。正確には、認証そのものは前から必要だった。しかしそれは単に.htaccessからBASIC認証するだけだった。今回はケータイからでも一部閲覧できるようにする必要があり、かつ閲覧ONLY(記事投稿権限なし)な人もいるので、諸般カスタマイズして作ることにした。
SerendipityにはプラグインでBASIC認証を組み込むものが用意されている(HTTP-Authentication)。他にLDAP認証できるプラグインもあるが、別途LDAP環境を構築する必要があるのでこちらはNG。今回はHTTP-Authenticationをカスタマイズして作っていくことにした。

■仕様
○SerendipityのAuthorとは別管理(テーブルを別途作成)
○テーブルに保存するデータ(ユーザ情報)は別機能で作成(こちらはcakePHPで)
○ログイン時に投稿権限があるかどうかチェックし、権限がある場合は自動的にSerendipityのAuthorログイン情報も取得して同時にログイン

つまり別テーブルでユーザ管理し、特定のユーザには別途権限を持たせ、そのユーザがログインしたときには、Serendipityの管理画面にも自動でログインさせる、ということになる。
まだまだ諸般作りこみは必要だが(ソースを修正しないとちょっと無理)、動くレベルにはなってくれた。そこでプラグインを作るときに必要になりそうなことを、現在わかっている範囲でメモしておく(基本的な書式については割愛し、「これ何だろ」と思ったところだけメモ)。

○function introspect()
基本情報(作者とかバージョンとか)をセットするための関数かな。

○function introspect_config_item()
プラグインで、ユーザに情報を登録されその情報に基づいてプラグインを動作させる場合に、管理画面に入力画面を表示させるわけだが、その画面を作成する際に使う。管理画面で入力された情報はデータベース内のserendipity_configというテーブルに書き込まれる。
ちなみに書き込まれた情報を呼び出すときは「$this->get_config(変数名)」などとして取り出す。

これだけを理解できればいいのかな、と思う。後は追加したい機能に類似したプラグインを探し、それをハックするのが手っ取り早い。最初から作る場合は・・・もう少し勉強は必要。


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