前回の予告通り、今回は
- 認証前に、あるページにアクセスする
- ログインフォームへ移動を促す
- ログイン後、元いたページに戻る
というロジックを検討します。
イメージとしては、図のような形です。
ウェブサービスでよくあるパターンですね。
実装方針として、以下のように考えてみました。
- 各ログインページに、認証済みかどうかのチェックロジックをインクルードする
- 認証前の場合、「戻り先ページ」として、現在のURLをセッションに記録
- 「ログインフォームへ移動してください」というメッセージと共に、リンクを表示
- ログイン後、セッションから、元ページURLを取得して、リンクを表示
- リンク移動後、セッションに記録されていた「戻り先ページ」の情報を破棄
以下、フローチャートです。
認証済みかどうかのチェックを行う
認証済みかどうかを確認し、ログイン認証前ならログインフォームへ移動するロジックを作ります。
ここでは、PEAR::AUTHのセッションが張られているかどうかを確認し、getAuthメソッドが返す値を取得。
偽=認証前なら、ページのURLをセッション変数「$_SESSION[‘return_url’]」へ保存。その後、ログインフォームへheader関数を利用してリダイレクト。
真=認証後なら、通常通り表示。
(この際、セッションに「戻り先ページ」の情報が記録されている場合=$_SESSION[‘return_url’]」に値が保存されている場合、unset関数を利用して削除します。
loginCheck.php
<?php
require_once("Auth/Auth.php");
$params = array(
"dsn" => "mysqli://pear:peartest@localhost/pear",
"table" => "auth",
"usernamecol" => "username",
"passwordcol" => "password",);
$myAuth = new Auth("DB",$params);
/* 直接アクセスしたファイル名を、http://などのプロトコル名から取得 */
$protocol = ($_SERVER['HTTPS'] && $_SERVER['HTTPS'] !== 'off')? 'https': 'http';
$_SESSION['return_url'] = $protocol . "://" . $_SERVER["SERVER_NAME"] . $_SERVER['SCRIPT_NAME'] ;
if(!($myAuth->getAuth())){
header("Location: http://localhost/nick_webservice/contents.php");
} else {
unset($_SESSION['return_url']);
}
?>
ページURL情報の取得には、スーパーグローバル変数の$_SERVERを利用して、サーバー名(ドメイン名)と、スクリプトURLを取得してつなげています。
場合によっては、httpsで接続されたページへのアクセスもあるかと思い、同じく$_SERVER変数を利用して、プロトコルの確認を行い、httpもしくはhttpsのどちらを戻り先情報として使用するか、判断しています。
認証後の戻り先リンクを表示する
loginCheck.phpで飛ばす、ログインフォームの「contents.php」の、ログイン成功ページを少し変更。
セッションに「戻り先ページ」の情報が保存されている場合、戻り先リンクを表示します。
contents.php
<?php
require_once("Auth/Auth.php");
function loginFunction($usr,$status){
require_once("loginForm.php");
}
$params = array(
"dsn" => "mysqli://pear:peartest@localhost/pear",
"table" => "auth",
"usernamecol" => "username",
"passwordcol" => "password",);
$myAuth = new Auth("DB",$params,"loginFunction");
$myAuth->setExpire(2400,FALSE);
$myAuth->setIdle(600,FALSE);
$myAuth -> start();
if($myAuth->getAuth()){
$display_name = $myAuth->getUsername();
print("</head><body>");
print("$display_name"."さん、こんにちは。<br />");
print("認証済みです。<br />");
if(isset($_SESSION['return_url'])){
print("元のページに戻る場合は、以下のリンクをクリックしてください。<br />");
print("<a href=\"".$_SESSION['return_url']."\">もとのページにもどる</a><br />");
}
print("<a href=\"logout.php\">ログアウトする</a><br />");
print("</body></html>");
print($_SESSION["hogehoge"]);
}
?>
戻り先URL情報が存在する場合=isset($_SESSION[‘return_url’]) が真の場合、戻り先URLへのリンクを表示します。
存在しない場合、戻り先URLは表示しません。
実行イメージ
テスト用に「test_a.php」というファイルを作成しました。
test_a.php
<?php
require_once("loginCheck.php");
?>
<html>
<head>
<title>テストページ</title>
</head>
<body>
<h1>テストページ</h1>
<p>テストです。</p>
</body>
</html>
実行後のイメージは、以下のとおりです。
認証済みの状態でtest_a.phpにアクセスした場合
認証前にtest_a.phpにアクセスした場合。
loginChek.phpの判定により、ログインフォームへ移動
ログイン後の画面。リンクをクリックして、元ページへ移動
直接ログインページにアクセス、認証した場合。戻り先リンクが表示されない。
必要に応じて「◯秒後に移動」など、リダイレクト処理を行うのもよいかなーと考えています。
次回は、ここまでのまとめ
次回は、勉強記録がちょうど10回目になることもあり、これまでの整理を行う予定です。
合わせて、PHPとPEARを勉強した上で感じたことを、自分宛のメモとして記録しておこうと思います。