ZendFramework1/認証処理

ZendFramework1/認証処理

適当な使い方しか書いてあるページしかなかったのでメモ

Zend Frameworkでは認証処理にZend_Authコンポーネントを使う。こいつは判定だけしてくれるだけで特に何か動きの制御をやってくれるわけではない。 この辺はZend_Aclと同様・・・

こういう思想で作られてるからほかのフレームワークとかライブラリと組み合わせやすいし見通しいい。

認証処理

お手軽ではないけど実用的にはユーザー情報はほぼDBに入っている場合が多いので、DBを使った認証をやってみる

require_once 'Zend/Db.php';
require_once 'Zend/Auth/Adapter/DbTable.php';
 
//DBの接続情報
$params = array('host' => 'localhost',
                'username' => 'hoge',
                'password' => 'piyopiyo',
                'dbname' => 'user_mst');
 
//接続用のオブジェクト取得
$db = Zend_Db::factory('Pdo_Mysql', $params);
 
//DB接続用オブジェクト、認証情報が入ったDBのテーブル名、
//そのテーブルのユーザーIDが入ったカラム名、パスワードが入ったカラム名
//・・・をしていして認証用オブジェクト作成
$auth = new Zend_Auth_Adapter_DbTable($db, 'user_mst', 'user_id', 'password');
 
//認証したい情報を入力
//ユーザーID
$auth->setIdentity('gegege');
 
//パスワード
$auth->setCredential('yoyoyoyo');
 
//問い合わせ
$result = $auth->authenticate();
 
//結果引き出し
if($result->isValid()){
    //認証OK
}else{
    //だめよ
}

こんな感じでかける。 isValidはレコードの存在のチェックをやっていて、0件ならば失敗ということになる。

本とか解説サイトとか見てもさらっと使ってみただけ・・・のような解説が多かった。 実用となると、さらっと使ってみただけのサンプルコードは使えないことがわかる、レコードん存在有無だけでそれも条件はIDとパスワードだけ・・・ こんなユーザーマスタはほぼ無いし、実際のシステムではユーザー情報を削除することはまれで、大体において、削除フラグのようなものを立てておいて残しておくものだ。 そうじゃないとユーザーマスタと関連があるトランザクションの扱いに困るからだ。

っでどうにかなんないのかなって思ってたら、実はこいうメソッドがある。

setCredentialTreatment

このメソッドは簡単に言うと問い合わせの際のSQLのWhere句を記述できるメソッドになる。

↑のコードに追加するとこんな感じ

//ユーザーID
$auth->setIdentity('gegege');
//パスワード
$auth->setCredential('yoyoyoyo');
//パスワードをどう取り扱うか+追加条件
$auth->setCredentialTreatment('MD5(?) and active_flg = 1');

setCredentialTreatment に本当に Where 句を書く感じ。 DB のカラムに active_flg というものを用意してアクティブなユーザーのみで認証をすることに設定している。 DB にはパスワードが暗号化されて保存されることが常なのでMYSQLのMD5()関数を使っている。 この setCredentialTreatment メソッドはプレースホルダが使えるようで setCredential で指定したパスワードが?の部分に代入されることになる。

ちょっとしたことだが・・・・ Zend Framework のオブジェクトの設定系のメソッドは戻り値が自分自身(this)なので、今風に・・・

//ユーザーID
$auth->setIdentity('gegege')->setCredential('yoyoyoyo')->setCredentialTreatment('MD5(?) and active_flg = 1');

こういう風にチェーン状に書くこともできる。

認証情報保持

認証っていうぐらいだから認証情報をリクエスト間で保持しとかないといけない、その保持方法。

この保持方法がイロイロなやりかたがあるっぽくて、ページを読んでると混乱した。認証オブジェクトの取得方法は2種類あって ↑で書いたように 直接認証オブジェクトをnewするような書き方

$auth = new Zend_Auth_Adapter_DbTable($db, 'user_mst', 'user_id', 'password');

と、こういう感じでZend_Authから引き出す方法がある。

$auth = Zend_Auth::getInstance();

引き出すやり方で認証が通ると自動的にZend_Sessionコンポーネントにusernameが勝手に登録されるらしいが、どう考えても情報はusernameだけじゃ足りないし、認証なんて大切な情報が暗黙的に登録されるのもキモイですな・・・

今回は直接newするほうを使っているので、勝手に登録されないのでOK。 じゃあ自前で登録しなければならんのだが・・・どうするか・・・

Zend_Authに貼り付けれるようなのでこいつに貼り付けて保持しておく。 認証成功後、必要な情報をstrageと呼ばれる部分につっこんでおく。 Javaとかだとここで馬鹿みたいに格納用のクラスをつくらないと気持ちわるいけど、PHPは配列が高性能なのでこいつで十分代用できる

Zend_Auth::getInstance()->getStorage()->write(array('user_id' => 'hoge', 'user_name' => 'もげ山ほげ太郎'));

こんな感じで押し込む。

逆に取り出すときは。

$hoge = Zend_Auth::getInstance()->getStorage()->read());
echo $hoge['user_id'];

こんな感じだろうか

strageにはほかにもいくつかメソッドがある

  • 中身を消去するclear()
  • 中身の有無を確認するisEmpty()

認証確認時はisEmpty、ログアウト時はclearで対処できる

Tag

php/zendframework1/zend_auth.txt · 最終更新: 2017-09-26 18:27 by ore