モンスターカレンダー

« 2010年1月
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Authの最近のブログ記事

AUTHのオプションにadvancedsecurityがある。「接続元のIP、UserAgent等をチェックするかどうか」。Trueにしてみた。すると、あるページに移るときに必ず権限チェックにひっかかってしまうようになった。ちゃんとログイン状態が続いているはずなのに。
ひっかかるのは、例えばURLが http://www.hoge.com/hoge/hogehoge/ から http://www.hoge.com/hoge/hogehogehoge/ に遷移する時。

ソースを調べてみる。...なんか良く分からない。はじかれているところは分かったが。
PEARのBugsを見てみる。と、
Request #4126 Auth AdvancedSecurity patch のトピックがあった。...今回のものが該当するのかどうか?してなさそうではあるが、これだけ不具合あるのかorz 全然バージョンアップされてないし。使えるパッケージなのにもったいないー。

とりあえずはこのパッチを適用してみようかと思う。

PEAR : Auth なんだか雑誌の通りには動かんし...と思ってたら、自分のは最新安定版1.2.3、
雑誌のはベータ版1.3.0r3 対象だった。

しかしベータ版にするのもためらわれる。。と1.2.3でも動くように作りこんでいたが、どうかんがえても、実行してみてもソース見てみてもおかしいバグあり。
件のベータ版を別マシンに落としてきてソース見たらきちんと修正済み。
...速攻でupgradeしました。

結構な時間を費やしてしまったような気がする。

ちなみにAuthの記事が載っていたのは↓「PHPプログラマーズマガジン 11月号」。
http://www.phppro.jp/index.html

コレはいいです。今までAuthについてあったらいいのに、と思われることがいっぱい載ってました。PEARマニュアルの修正(翻訳)お手伝いしようかとも思っていたことがあったけどこれでもう必要ない気が。

=== 追加 ===
$data = $a->getAuthData();

では、username と password はとれません。
username は getUsername() で個別にとれます。
password は、なかったような。。。。

AuthではusernameにユニークなIDを設定する。
以下の例では user_table がテーブル、user_id がユニークなIDである。


$dsn=DATASET_NAME;
$params = array(
"dsn" => $dsn,
"table" => "user_table",
"usernamecol" => "user_id",
"passwordcol" => "pass"
);
$a = new Auth("DB", $params, "loginFunc", false);

今回、user_id にはメールアドレスをセットした。

ユーザの削除を考えたときに、実際にレコードを削除すれば何の問題もない。
しかしユーザ情報そのものはのこしておきたい、「削除フラグ」でその状態を判定したいとなったときに問題が発生する。メールアドレスの重複が発生してしまう。

重複があったまま、Authを適用すると当然ながらどのデータをひっぱってくるのか分からない。

これを解決するために、テーブルのViewを作った。

delete_flg = 1のものが削除データとすると、

user_view を select * from user_table where delete_flg != 1

として作成。Authには


$params = array(
"dsn" => $dsn,
"table" => "user_view",
"usernamecol" => "user_id",
"passwordcol" => "pass"
);

とviewを指定した。

Authでユーザ認証をしている。
ログイン機能と、ログイン中かどうかはマニュアルなどのサンプルで作った。(でもSmartyとからませて、エラーメッセージを出すのにはちょっと苦労したけど。。またこの話も書きたい)

ログイン中の場合に、その人の名前を出そうというお客さんの希望が出た。よく「XXさん、こんにちは」などとショッピングサイトででているやつ。
AuthでいうusernameはIDのことなので氏名とは違う。
要はユーザテーブルの他の情報を、ログイン時にとってこれればいいわけで。。。。

getAuthData() がそれか? 発行してみるが何も返ってこない。setAuthData()で、自力でセットした値だけを保持する器なのか?
だったら、ユーザテーブルにアクセスする時点で何か自分でコードを追加して保持させようか。

と、いろいろとあちこちにメッセージ入れて実行させて追って行って、、分かりました。
Authのインスタンス作成時にある指定をすると、ユーザレコードの内容を配列で取得し、getAuthData()で取れるようになるのでした。


$dsn=DATASET_NAME;
$params = array(
"dsn" => $dsn,
"table" => "user_table",
"usernamecol" => "user_id",
"passwordcol" => "pass",
"db_fields" => "*" //←ここ!!
);

$a = new Auth("DB", $params, "loginFunc", false);

$a->start();
$a->setIdle(300);
$a->setExpire(300);

$data = $a->getAuthData(); //これでユーザデータの配列がとれる

こんなのマニュアルのどこにも書いてないし。。ソースにしか書いてないし。。。。