PHP/Zend Framework/認証処理

最終更新: 2016-02-17 (水) 11:16:07 (464d)

このページの内容は https://boo-yakinikunotare.ssl-lolipop.jp/orebase2/zendframework1/zend_auth に移動しました。

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

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

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

認証処理 Edit

お手軽ではないけど実用的にはユーザー情報はほぼ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');

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

認証情報保持 Edit

認証っていうぐらいだから認証情報をリクエスト間で保持しとかないといけないからね、その保持方法
この保持方法がイロイロなやりかたがあるっぽくて、ページを読んでると混乱した
認証オブジェクトの取得方法は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で対処できるね

参考サイト Edit

タグ Edit

Tag: PHP Zend Framework 認証処理 移動済み

リロード   new Edit 凍結 差分 Upload 複製 名前変更   Home Page list Word Search Recent Update バックアップ Referer   Help   最終更新のRSS
Last-modified: 2016-02-17 (水) 11:16:07 (464d)