他のシステムと連携させるために

2007/04/01 | cakePHP

cakePHPを別のブログシステムと連携させるところで再びはまる。
ブログシステムで設定した認証が引き継げない。認証の状態はセッションに持たせているわけだからセッションが引き継げていないことになる。
実際、スクリプト中で「var_dump($_SESSION);」などとしても、ブログ側とcakePHP側では異なるものが出力された。何故???。

30分くらい悩んでようやく理由がわかった。「セッションが引き継げていない」(いや、それはそうなんだけどさ)。

セッションが引き継げない時にやってみることを考えてみた。
(1) 手動で「?PHPSESSID=」などとURLに付加して試してみる。
これはNGだった。

(2) セッションの保存場所を確認してみる。
どちらも「/tmp」だった。

(3) セッション名が違う???。
これが正解でした。そもそもフレームワークでもブログシステムでも、そこそこの仕組みになってくるとセッション名を自前で設定していることが多いっぽい。そこには注意がいかなかった。

cakePHPでは以下のファイルでセッション名を設定できるみたい。
app/config/core.php

ここでdefine(‘CAKE_SESSION_COOKIE’,’CAKEPHP’);の記述を書き換えることで、無事セッションが引き継げるようになった。よかった、よかった。久しぶりに基本的なところで悩んでしまったよ。

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で作成したスクリプトを流用して、立派なユーザ管理画面ができた。便利!。


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