gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

phpのsession関数を使ってのギミック

PHPのセッションは、便利な反面色々と気になる事もあるのですが。
そのうち
・「セッション有効時間」をきっちりしたい(有効時間が切れたら問答無用で切断したい)
・アカウントロックの実装をかけて、ロックしたら「ログイン出来ない」だけじゃなくて「現在ログイン中のアカウントもシャット」したい
のあたりを解決しようかなぁ、と思いました。


細かい所をかくと
・「自分のアカウントに紐付いているセッションIDのうち、現在のセッション以外を全部遮断」(gmailの「アカウント アクティビティ」の「他のすべてのWebセッションからログアウト」)
も実装したいのだけど…ここに手を入れるのは些か難儀なので、一旦見送り。


で、実装方法を簡単に。
基本は、いわゆる「認可(authorization):ログイン中のユーザかどうか」の判断ロジックのところで、少しギミックを入れました。
その手前として、ログイン(認証:authentication)のタイミングでも、ギミック追加しています。


寿命については、大まかには
・ログイン時に、$_SESSIONに「有効時間」を入れる
・認可の度に
・・有効時間を超えてたら問答無用でログアウトさせる
・・有効時間範囲内なら「有効時間を更新して」認可する
ってロジック。


また合わせて、認可のタイミングのラスト付近で「ロックテーブル」なるテーブルを1枚用意して。最低限としては「ユーザID」だけがカラムにあればよくて、判断としては
・ロックテーブルに「認可を試みてるユーザのユーザIDが存在してたら、認可しない」
って感じで「問答無用でロック」が出来るようにしました。
…DBアクセスが1つ増えるのが微妙っちゃぁ微妙なんだけど、まぁその辺はトレードオフかなぁ、と。
基本「KVS的なアクセス」でよいので、その辺で色々と小細工をしてみてもよいだろうし。


たいした実装でもないのですが、色々と「ちょっともにょってた」ところが実装できたので、割と満足でございます。


実装サンプルはこちらからどんぞ。
https://github.com/gallu/MagicWeaponTest
の「lib/common/base_model_admin_base.inc」と、
https://github.com/gallu/MagicWeapon
の「authorization_session.inc」
あたりを追いかけていくと、大体、処理が点在しています(笑


あとは…微妙っちゃぁ微妙なのですが
・そもそも「Anonymouse セッション(ログインしてなくても始まるセッション)」ってどうなんだろう?(セッションアダプションはやっぱりちょっと気になる)
・「他のすべてのWebセッションからログアウト」入れたいよねぇ
あたりになると、セッション周りを「自作しなおすかねぇ( http://d.hatena.ne.jp/gallu/20160402/p1 )」という話になって。
ただ、この辺になると上述で言うところの「authorization_session.inc」の処理にも手を加える(ってか多分、別クラスにする)ってのもあって…ってのが、「セッションIDを作ったり設定したりする」辺りを全部自前実装にする気ぃ満々なのでw
興味はあるんだけど少し時間がかかりそうで……次回短期入院の時の課題かなぁ、とw


まぁ「なければ作る」はUNIX系列の伝統的作法だと思うので。
便利なPHPの機能は最大限「そのまま使いつつ」、不便な所をラップしていくのが最近のおいちゃんの好みかなぁ、という辺りでの邁進を想定しておりまするる。