スパイスラボ神部です。
以前、CakePHP で Basic 認証のやりかたについて書きました(CakePHP 1.2 の Basic 認証設定があまりにも簡単すぎる ( ラボブログ ) )。この方法はたしかに簡単なのですが、アカウント/パスワードの組み合わせを beforeFilter などにハードコーディングしなければならないという状況がありました。
そこでちょっと考えてみてください。もし AuthComponent を使ってユーザ管理を行っている場合、ここで使っているユーザIDとパスワードを上手に使って Basic 認証などの認証を上記のような Security コンポーネントの取り回しをすることができれば、サイトの可能性がもっと広がるかもしれません。例えば、OpenID の認証なんかをうまくハンドリングすることが出来るかもしれません。今回はそのやりかたの基礎的な部分についてかんたんに紹介したいと思います。
まずは基本のおさらい
基本は、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でしか使えないと言う問題があります。
PHP5 の場合では、HTTP_AUTHORIZATION: という値で代用できるようですが、これもサーバの設定次第です。セキュリティ自体は低下のリスクがあるので、最悪今後レンタルサーバでは PHP による柔軟な Basic 認証の運用が出来なくなる危険性があります。これは認識しておきたいですね。
-PHP5
-PHP4
でもこれは、FasitCGI Module が入っていないと機能しないようです。
-Ruby on Rails/apache2+FastCGIでBASIC認証 - アークウェブシステム開発SandBox
-Foodyn CMS開発日誌 - ApacheでFastCGI使ったベーシック認証
関係無い補足
なんだか時折、CakePHP のロガー、$this->log() が動かないときがあるなと思っていたのですが、app/tmp/logs に書き込み可能属性がないといけないようです。ちょっとしたメモでした。
あとはこんなのとか。
-CakePHPのAuthコンポーネントのパスワード暗号化を無効にする - Rewish
-Web認証システムの作り方大全―Apache/IIS/PHP/Servlet&JSPそれぞれの場合が好き! - ILOVEIT(β)
関連記事


