新メンバーズページのログイン方式が出来上がりました。
前回出した画面とあんまり変わっていないかもしれませんが

現在のメンバーズページはブラウザ標準のダイアログで
ユーザIDとパスワードを入力する仕組みになっていますが
新しいメンバーズページでは上のような画面でログインすることになります。
んで
以前はメンバー登録時に
「ログイン情報の保持」を指定できるようにしてありました。
現在は無条件でログイン情報を保持するようになりました。
まあそれはそれで問題ですが…。
新しいメンバーズページでは、
ログイン時に保持するかどうかを選択できる機能を実装。
「ログイン情報保持」にチェックした場合は
最終ログインから3か月間はこのログイン画面を介さずログインできる仕組みです。
現在多くのサイトで利用されている仕組みですので
ここで多く説明する必要はないかもしれません。
んで
管理人はWebエンジニアではありませんので
今回この部分にだいぶ時間をかけてしまったわけですが
自分の備忘録として一応その仕組みを書いておきます。
技術的な話なので、
興味ない方は読み飛ばしてください。
-----
まず基本として
ログイン画面と、ログイン画面以外のページでは
認証ロジックが異なります。
ログイン画面以外の認証ロジックは
・ログインしているかのチェック
→ログイン状態ではない場合はログイン画面に自動遷移。
このとき、ログイン成功後この画面に戻ってこられるように
自分のURI(Request_URI)を渡す
→ログイン状態の場合は通常通り表示。
ログイン画面の認証ロジックは
・ログインしているかのチェック
→ログインしている場合はトップページへ遷移。
→ログインしていない場合、もしくはログインに失敗した場合は
ユーザIDとパスワードの入力をしてもらう。
正しいIDとパスワードの場合は、受け取った前画面のURIへ遷移。
前画面のURIがない(いきなりログイン画面に飛んできた)場合は
トップページへ遷移する。
これをPHPでSessionとCookieを使って導入すると
ログイン画面以外の認証ロジックは
include(…)で共通処理としておく。しかもページの最初に処理。
(Headerが送信される前に処理しないとダメ)
session_start()してから
$_SESSIONのユーザIDとパスワードを取得し
取得できない場合はheader(ログイン画面)でログイン画面へ。
その際はsession_destroy()で中途半端なセッションは消す。
$_SESSIONで取得できた場合は
いったんsession_destory()でセッションを削除する。
そしてsession_regenerate_id()でセッションIDを再作成したうえで
session_start()して$_SESSION=…で
ユーザIDとパスワードとログイン情報保持on/offをセッションに保存。
これ、なんでdestroyするかってところがミソ。
destroyしないと
session_set_cookie_params()関数が効かないんですよね。
結局、ログイン情報を保持するかしないかは
Cookieをいつまで生かしておくかって話。
それはsession_set_cookie_paramsを使って設定しますが
session_startをやってから設定しても意味がないので
いったんdestroyしてsession_set_cookie_params()してから
再度session_startするということ。
一応ロジックを書いておきます。
(当然一部修整してあります)
書いてませんが
当然一番最初にsession_start()は書いてあります(session_name("メンバー用サイト")とともに)
それと、最後にsession_write_close()も書いてあります。
このロジックを作るときに
管理人はRequest_URIを勘違いしてRefererと書いていて
無限ループに何度も陥りました(Session関係ないし←アホ)
まあとりあえずこれで問題なく動いているので(無駄な部分がいくつかあると思いますが)
当面はこのまま行こうと思います。
---
ということで
最大の難所だったログインのロジックが出来上がりましたので
あとはシコシコと各ページを書いていくだけ。
まずはログインがらみで
・新規ユーザ登録
・登録情報の変更・削除
の2画面と、今回新たに作成する予定の
・パスワードを忘れた場合の問い合わせ画面
を作っていこうと思います。
この3画面の作成には、いくつかデータベースの構成変更も伴いますので
ちょっとまた時間がかかるかもしれません。
状況はこのブログで逐一ご報告できればと思っています。
-----
さて。
明日、管理人は今週2回目の夜勤でございます。
去年までは夜勤の際はブログをお休みしていましたが
今年はできるだけ書いていこうと思います。
365日かけるかなぁ?
大したことは書けません(PCは持って行かないので:ケータイから書くので
週末の予定とか
サイト更新の今後の話とか
ちょろっと書ければと思っています。

現在のメンバーズページはブラウザ標準のダイアログで
ユーザIDとパスワードを入力する仕組みになっていますが
新しいメンバーズページでは上のような画面でログインすることになります。
んで
以前はメンバー登録時に
「ログイン情報の保持」を指定できるようにしてありました。
現在は無条件でログイン情報を保持するようになりました。
まあそれはそれで問題ですが…。
新しいメンバーズページでは、
ログイン時に保持するかどうかを選択できる機能を実装。
「ログイン情報保持」にチェックした場合は
最終ログインから3か月間はこのログイン画面を介さずログインできる仕組みです。
現在多くのサイトで利用されている仕組みですので
ここで多く説明する必要はないかもしれません。
んで
管理人はWebエンジニアではありませんので
今回この部分にだいぶ時間をかけてしまったわけですが
自分の備忘録として一応その仕組みを書いておきます。
技術的な話なので、
興味ない方は読み飛ばしてください。
-----
まず基本として
ログイン画面と、ログイン画面以外のページでは
認証ロジックが異なります。
ログイン画面以外の認証ロジックは
・ログインしているかのチェック
→ログイン状態ではない場合はログイン画面に自動遷移。
このとき、ログイン成功後この画面に戻ってこられるように
自分のURI(Request_URI)を渡す
→ログイン状態の場合は通常通り表示。
ログイン画面の認証ロジックは
・ログインしているかのチェック
→ログインしている場合はトップページへ遷移。
→ログインしていない場合、もしくはログインに失敗した場合は
ユーザIDとパスワードの入力をしてもらう。
正しいIDとパスワードの場合は、受け取った前画面のURIへ遷移。
前画面のURIがない(いきなりログイン画面に飛んできた)場合は
トップページへ遷移する。
これをPHPでSessionとCookieを使って導入すると
ログイン画面以外の認証ロジックは
include(…)で共通処理としておく。しかもページの最初に処理。
(Headerが送信される前に処理しないとダメ)
session_start()してから
$_SESSIONのユーザIDとパスワードを取得し
取得できない場合はheader(ログイン画面)でログイン画面へ。
その際はsession_destroy()で中途半端なセッションは消す。
$_SESSIONで取得できた場合は
いったんsession_destory()でセッションを削除する。
そしてsession_regenerate_id()でセッションIDを再作成したうえで
session_start()して$_SESSION=…で
ユーザIDとパスワードとログイン情報保持on/offをセッションに保存。
これ、なんでdestroyするかってところがミソ。
destroyしないと
session_set_cookie_params()関数が効かないんですよね。
結局、ログイン情報を保持するかしないかは
Cookieをいつまで生かしておくかって話。
それはsession_set_cookie_paramsを使って設定しますが
session_startをやってから設定しても意味がないので
いったんdestroyしてsession_set_cookie_params()してから
再度session_startするということ。
一応ロジックを書いておきます。
(当然一部修整してあります)
// セッションからユーザIDとパスワードを取得
// request_URIも取得
$ユーザID = $_SESSION["ユーザID"];
$パスワード = $_SESSION["パスワード"];
$ログイン情報保持on/off = $_SESSION["ログイン情報保持on/off"];
$リクエストURI= $_SERVER["REQUEST_URI"];
// データベースでユーザIDとパスワードを検索
// このユーザ、ホントに登録されているよね?って確認
$わお = mysqli_query($DBリンク,"select * from メンバー情報テーブル " .
" where ユーザID=’$ユーザID’ and パスワード=’$パスワード’");
$わおrow = mysqli_fetch_array($わお);
extract($わおrow);
if ($ユーザID==NULL) {
// 登録ユーザがいない場合(セッションに記録されていない場合)は
// セッションを破棄して、リクエストURIを持ってログイン画面へ遷移する
session_destroy();
setcookie(session_name(), "", time()-42000, "/",".sundaybreeze.jp");
setcookie("request",$リクエストURI);
header("Location: /ログイン画面");
exit;
} else {
// 登録ユーザがいて、ログインされている状態の場合は
// いったんセッションを破棄する(このとき$_SESSION[]は消しちゃダメ)
session_destroy();
// 再度セッションを開始
session_name("メンバー用サイト");
// いったんCookieの有効期限を0(ブラウザ閉じたら消去)に設定
session_set_cookie_params(0,"/",".sundaybreeze.jp");
// ログイン情報保持がonなら、Cookieの有効期限を30日(60秒×60分×24時間×60日)でセット
if ($ログイン情報保持on/off=="on") session_set_cookie_params(60*60*24*60,"/",".sundaybreeze.jp");
// 改めてセッションスタート
session_start();
// 改めてセッションにユーザID、パスワード、ログイン情報保持on/offをセット
$_SESSION["ユーザID"] = $ユーザID;
$_SESSION["パスワード"] = $パスワード;
$_SESSION["ログイン情報保持on/off"] = $ログイン情報保持on/off;
書いてませんが
当然一番最初にsession_start()は書いてあります(session_name("メンバー用サイト")とともに)
それと、最後にsession_write_close()も書いてあります。
このロジックを作るときに
管理人はRequest_URIを勘違いしてRefererと書いていて
無限ループに何度も陥りました(Session関係ないし←アホ)
まあとりあえずこれで問題なく動いているので(無駄な部分がいくつかあると思いますが)
当面はこのまま行こうと思います。
---
ということで
最大の難所だったログインのロジックが出来上がりましたので
あとはシコシコと各ページを書いていくだけ。
まずはログインがらみで
・新規ユーザ登録
・登録情報の変更・削除
の2画面と、今回新たに作成する予定の
・パスワードを忘れた場合の問い合わせ画面
を作っていこうと思います。
この3画面の作成には、いくつかデータベースの構成変更も伴いますので
ちょっとまた時間がかかるかもしれません。
状況はこのブログで逐一ご報告できればと思っています。
-----
さて。
明日、管理人は今週2回目の夜勤でございます。
去年までは夜勤の際はブログをお休みしていましたが
今年はできるだけ書いていこうと思います。
365日かけるかなぁ?
大したことは書けません(PCは持って行かないので:ケータイから書くので
週末の予定とか
サイト更新の今後の話とか
ちょろっと書ければと思っています。
[コメント読む(0)]
