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’])){

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

cakePHPでページング(パスの変更)

2007/07/25 | cakePHP

WindowsにXamppをインストールしてウェブアプリの開発をしていたのだが、ファイルをLinux上のサーバにアップしたら、ページング処理が動かなくなってしまった。エラーメッセージを見たら、単にpear内のファイルの呼び出しでエラーがあった。これを以下のような具合で修正した。

require_once(dirname(__FILE__).’/*******’);

無事にこれで動いたのだが、なぜWindows上では大丈夫だったのだろうか。OSも違うし、PHPのバージョンも違うし、原因を探るのはめんどくさいのでやらないけれど。

cakePHPではpearのファイルをvenderディレクトリに設置して使っているが、別にvenderディレクトリにパスを通しているわけではない。そういう意味では、cakePHPでpearを使う場合、使いようによってはpear内部のファイルで多少修正が必要になりそうだ。いちおうメモメモ。

Admin Routingの認証

2007/07/22 | cakePHP

cakePHPは管理者用の機能のことも考えられている。それが「Admin Routing」。
この機能を使うと、閲覧者用のコントローラ内に管理者用の機能を記述することが出来る。単にそれだけだと何のことはないが、コントローラでの記述を正しくおこなうと、URLも自動で「admin」とついたそれらしいものになる(もちろんadminではなくsuperuserやroot等といったURLにすることも出来る)。

コントローラ内のfunction名は「admin_index()」といった具合に「admin_」をつけてやる。「index()」にアクセスするには、

http://hogehoge.com/controller/index

だが、「admin_index()」の場合は、

http://hogehoge.com/admin/controller/index

といった具合。app/config/core.php内の設定で、

define(‘CAKE_ADMIN’, ‘admin’);

上記の記述を、

define(‘CAKE_ADMIN’, ‘superuser’);

等に書き換えるとURLは

http://hogehoge.com/superuser/controller/index

になる(らしい)。同じコントローラ内に処理を書いておけるというのはとてもわかりやすくて好感が持てる。

ただし、これは単にroutingしてやるだけで、認証処理も同時に追加できるわけではなく、「自分で実装してくれ」とマニュアルに書いてある。これ、どうすればいいんだろう、と悩んでたら1×1さんのサイトで書かれていたことを応用すれば出来そう(shinさんお元気ですか?、一度カンファレンスでお会いさせていただきました!)。

1×1さんのサイトでは、管理者用のレイアウトをはめ込む際に、コントローラ内のbeforeRender()で、以下のスクリプトを追加する方法を紹介されている。

function beforeRender() {
  if(defined(‘CAKE_ADMIN’) && !empty($this->params[‘admin’])){
    $this->layout = ‘admin';
  }
}

これを応用して、beforeFilter()でチェックと認証をすればできそうな感じ(そんな関数あったよね、たしか)。

function beforeFilter() {
  if(defined(‘CAKE_ADMIN’) && !empty($this->params[‘admin’])){
    (認証処理)
  }
}

まだ現時点では未検証。近々実装するのでレポートもその際に。

アソシエーション先のテーブルデータの取得で

2007/07/21 | cakePHP

cakePHPのすごいところは、SQLを書かなくてもテーブルからデータを持ってくるところだけど、もっとすごいのは設定さえ書いておけば、リレーション先のテーブルからもデータを持ってきてしまうところ。ここ数日cakePHPをつってCMSを作っているけど、SQLをまったく書かなくていい、というのもすごい話だ。

リレーション先のデータを取得するための設定はcakePHPではアソシエーションというが、これをモデルで設定することは前に書いた。モデル(クラス)内で、

var $hasMany=array();

と記述するのだが・・・、この記述、PHPの約束事で、演算はおこなえないのだ。今回の場合、古いデータは必要ないので当該日以降のデータだけ取得したかった。つまり、アクセスするたびに関数で取得条件が変えたい、というわけだが、演算子が使えないのでモデル内で設定が出来ないのだ。
こんな場合は、コントローラ内で、以下のように記述することで対応できた。

$this->[モデル名]->hasMany[‘関連先モデル名’][‘conditions’]=”条件”;

コントローラ内で、モデルで設定した$hasManyを上書きするのだ。なんとなく「無理やり」の感もあるし、これでいいのかどうかわからないが、うまくデータは取得できている。いい感じ。

慣れると割りと使いやすい、cakePHP。もう少しがんばって、一つサイトを構築してしまおう。


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