トップ > ラボブログ

ラボブログ

« ついに「ソーシャルアプリケーション アワード」募集開始! | メイン | DreamWeaver で JavaScript!(OpenSocial 開発) »

CakePHPのユーザDBで Basic 認証するには!

あとで読む

スパイスラボ神部です。


以前、CakePHP で Basic 認証のやりかたについて書きました(CakePHP 1.2 の Basic 認証設定があまりにも簡単すぎる ( ラボブログ ) )。この方法はたしかに簡単なのですが、アカウント/パスワードの組み合わせを beforeFilter などにハードコーディングしなければならないという状況がありました。


そこでちょっと考えてみてください。もし AuthComponent を使ってユーザ管理を行っている場合、ここで使っているユーザIDとパスワードを上手に使って Basic 認証などの認証を上記のような Security コンポーネントの取り回しをすることができれば、サイトの可能性がもっと広がるかもしれません。例えば、OpenID の認証なんかをうまくハンドリングすることが出来るかもしれません。今回はそのやりかたの基礎的な部分についてかんたんに紹介したいと思います。


-認証が好きだ! - Favorites!


まずは基本のおさらい


基本は、CakePHP の Security Component を使うことから始まります。


-ベーシック HTTP 認証 :: セキュリティコンポーネント :: 主要なコンポーネント :: マニュアル :: 1.2 Collection :: The Cookbook


使い方はこちらにあるとおり。簡単ですね。


認証用のコールバック関数を使ってモデルベースの認証を!


やり方を探してみたところ、こんなやり方が見つかりました。


-(Bad) Tip: Checking HTTP Auth against your normal users table - CakePHP | Google グループ


ポイントは、loginOption の指定で「'login'=>'authenticate'」という項目が入っていること。これにより、任意の認証の処理を指定した名前の関数で行い、そこでログイン処理を行ったうえ、 true か false かを返し、その戻り値により basic 認証を完了出来たかということを処理できるというわけです。簡単ですね!


また、一緒に書かれている blackHole メソッドは、認証処理を中断して exit させるためのメソッドのようです。


たとえばこんな感じで書くとよいかも。



function _blackHole($error) {
if ($error=="secure") {
// SSL でリダイレクトさせるなどの処理
exit;
}
}


ちょっとだけ補足


ユーザモデルを使った認証、上記のようなやりかたではうまくいかないので、自分の方ではこうしたところうまくいきました。



$data = array(
'User.username' => $args['username'],
'User.password' => $this->Auth->password($args['password'])
);
$status = $this->Auth->login($data);
//var_dump($status);

if ( $status ) {
return true;
} else {
$this->Security->blackHole($this, 'login');
return false;
}


参考にしたのはこちらです。


-【CakePHP】OpenIDをAuthComponentにトッピングしてみる | ねねとまつの小部屋


Security Component マニアックス


少し調べたら、ちょっと参考になるサイトがありました。


-CakePHP Security コンポーネントのまとめ | Sun Limited Mt.


クロスサイトリクエストフォージェリ(CSRF) を防ぐ方法とか、特定のアクションからのポストのみ許可する方法など、こちらも参考になります。


注意!


CGI版のPHPは Basic 認証による値を受け取ることが出来ないので、Security コンポーネントによる方法は利用出来ません。


代替として下記のような方法がありますが、サーバの設定によるのと、PHP4でしか使えないと言う問題があります。


-phpでベーシック認証 - bnote


PHP5 の場合では、HTTP_AUTHORIZATION: という値で代用できるようですが、これもサーバの設定次第です。セキュリティ自体は低下のリスクがあるので、最悪今後レンタルサーバでは PHP による柔軟な Basic 認証の運用が出来なくなる危険性があります。これは認識しておきたいですね。


-PHP5


-PHP4


でもこれは、FasitCGI Module が入っていないと機能しないようです。


-Ruby on Rails/apache2+FastCGIでBASIC認証 - アークウェブシステム開発SandBox


-Foodyn CMS開発日誌 - ApacheでFastCGI使ったベーシック認証


-HTTP_AUTHORIZATION


関係無い補足


なんだか時折、CakePHP のロガー、$this->log() が動かないときがあるなと思っていたのですが、app/tmp/logs に書き込み可能属性がないといけないようです。ちょっとしたメモでした。


あとはこんなのとか。


-CakePHPのAuthコンポーネントのパスワード暗号化を無効にする - Rewish


-Web認証システムの作り方大全―Apache/IIS/PHP/Servlet&JSPそれぞれの場合が好き! - ILOVEIT(β)
 



関連記事



ブックマークに追加する この記事についてTwitterでツイート

トラックバック

このエントリーのトラックバックURL:
http://www.spicebox.jp/cgi-bin/mt/mt-tb.cgi/1111

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

mixiアプリ本
4/22発売!

mixiアプリをつくろう!
OpenSocialで学ぶ
ソーシャルアプリ



(株)スパイスボックス
神部 竜二(著)

書籍情報






検索



神部竜二
ブログ執筆者の一人です。ネットの新しい話題や Web まわりのプログラミング、Web 広告について書いていきたいと思います。


About

2009年07月04日 21:26 に投稿されたエントリーのページです。

ひとつ前の投稿は「 ついに「ソーシャルアプリケーション アワード」募集開始! 」です。

次の投稿は「 DreamWeaver で JavaScript!(OpenSocial 開発) 」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

SEO ブログパーツ  

+ インデックス数計測 +