- ベストアンサー
ログインの流れについて
- ログインフォームにユーザ名とパスを入力し、正しければログインした日時をDBに登録し、ワンタイムパスワードを発行しDBに登録します。セッションの有効時間は5分であり、セッションがスタートする際にユーザ名とワンタイムパスワードの値を保持します。
- 5分間操作がなかった場合には「有効期限がきれました」としてログインフォームに戻りますが、有効期限内に他のページに移動した場合は、DBに問い合わせてセッションのワンタイムパスワードの値を確認する必要があります。
- 一般的には、ログインした時点でログイン時間を記録し、セッションの有効時間までの間に一定の操作が行われているかをチェックします。操作がない場合にはセッションが切れたとしてログインフォームに戻りますが、他のページに移動した場合は、セッションのワンタイムパスワードの値を確認する必要があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>$_SESSION['auth']['s_id'] = 'DBに登録されてあるsession_id'; >$_SESSION['auth']['login_date'] = 'DBに登録されてあるログイン日時'; >$_SESSION['auth']['limit_date'] = 'DBに登録されてあるログイン有効期限の日時'; 今回必要になるのって、この三つのうち、login_dateだけですよね。 s_idはCookieに持たせる物、limit_dateは、アプリケーション全体のコンフィグファイルかなんかで設定しておく物、かなと。 この他に必要になるものは、会員のIDとかあたりでしょうか。各ログイン後ページに言ったときに毎回データベースに会員のIDから会員情報を引っ張る感じです。 ■ログイン画面/ログイン後に遷移出来る画面全体で必要な処理 ・SESSION['auth']が存在していて且つ、login_date(これはtime()そのままの値のほうが扱いやすいかと)と、アプリケーションが設定しているLIMIT_TIME(5分なら、300)を見てタイムアウトしていないかの確認処理 ・ログイン出来ている状態だったら、login_dateを現在時刻に更新 ・ログインしていない状態で且つ、cookieに自動ログイン用のワンタイムパスが発行されていて且つ、ソレが正しいものかを確認する処理。正しければセッションを発行してログインさせる ・session_regenerate_id(true)する処理 ■ログイン画面 ・フォームから受け取った会員IDとパスワードが正しいか確認の上、正しければ、セッションを発行した上で、login_dateを現在時刻にしてログイン後のトップページにでもリダイレクトする処理 といった感じでしょうか。
その他の回答 (1)
- hogehoge78
- ベストアンサー率80% (433/539)
Sessionは、CookieにSessionIDを持たせるので、ワンタイムパスワードの使いどころがない気がしますが、どうでしょうか。 そして、Sessionは、遷移毎に、session_regenerate_id関数で、SessionIDを変更してやることで、セッションハイジャックを防ぐ、という感じになると思います。 自動ログイン機能を付ける場合に、1日とか期限付きでワンタイムパスワードをつけたいというのであれば、ログインが必要なページ全てに、そのワンタイムパスワードを見てログイン状態にするロジックを仕込む必要があります。 例) http://d.hatena.ne.jp/hiromi2424/20100610/1276147639 また、上記に書いたものとは別の意図があって必要な処理なのであれば、毎回確認する必要があるきがします。 どちらにしても、一緒にSessionに付与しているユーザ名から、ユーザ情報を毎回確認する必要があると思いますので(すでに退会とか管理者からのアクセス規制しているのにセッションがあったら画面遷移できちゃうとか)、 それと合わせてチェックしてしまえばいいのかなと思います。
補足
お返事ありがとうございます。 >Sessionは、CookieにSessionIDを持たせるので、ワンタイムパスワードの使いどころがない気がしますが、どうでしょうか。 session_regenerate_id関数で、SessionIDを変更するのであえてワンタイムパスワードのロジックを 組まなくても用意されてある関数で代用できるという事ですね! 自動ログイン機能をつけるのであれば有効期限を2週間と設定し自動ログインを しないのであれば5分間操作がない場合、ログイン状態をリセットしたいのですが 以下のような感じでOKでしょうか? session_start(); // ログインフォーム処理 if (ログイン情報が正しく入力されれば) { $login_date = date(Y-m-d H:i:s); $limit_date = '$login_dateに有効期限を足した日時'; session_regenerate_id(true); //session_idをDBに登録 //ログイン日時をDBに登録 //ログイン有効期限の日時をDBに登録 $_SESSION['auth']['s_id'] = 'DBに登録されてあるsession_id'; $_SESSION['auth']['login_date'] = 'DBに登録されてあるログイン日時'; $_SESSION['auth']['limit_date'] = 'DBに登録されてあるログイン有効期限の日時'; } else { // エラー処理 } --------------------------------------------------------------------------------- // ログインが必要なページでの処理 if (is_array($_SESSION['auth']) && count($_SESSION['auth']) == 3) { $s_id = 'DBに登録されてあるsession_id'; if ($_SESSION['auth']['s_id'] == $s_id && $_SESSION['auth']['limit_date'] > date(Y-m-d H:i:s)) { $login_date = date(Y-m-d H:i:s); $limit_date = '$login_dateに有効期限を足した日時'; session_regenerate_id(true); //ここでSessionIDを変更 //session_idをDBに登録 //ログイン日時をDBに登録 //ログイン有効期限の日時をDBに登録 // セッション情報の書き換え $_SESSION['auth']['s_id'] = 'DBに登録されてあるsession_id'; $_SESSION['auth']['login_date'] = 'DBに登録されてあるログイン日時'; $_SESSION['auth']['limit_date'] = 'DBに登録されてあるログイン有効期限の日時'; } } else { // ログインフォームへリダイレクト }