ログイン後に元のページに戻る(PHP+PEARでウェブサービス勉強記録・9)

前回の予告通り、今回は

  • 認証前に、あるページにアクセスする
  • ログインフォームへ移動を促す
  • ログイン後、元いたページに戻る

というロジックを検討します。

イメージとしては、図のような形です。

ウェブサービスでよくあるパターンですね。

 

force_login

 

実装方針として、以下のように考えてみました。

  1. 各ログインページに、認証済みかどうかのチェックロジックをインクルードする
  2. 認証前の場合、「戻り先ページ」として、現在のURLをセッションに記録
  3. 「ログインフォームへ移動してください」というメッセージと共に、リンクを表示
  4. ログイン後、セッションから、元ページURLを取得して、リンクを表示
  5. リンク移動後、セッションに記録されていた「戻り先ページ」の情報を破棄

 

以下、フローチャートです。

 

 login_check

認証済みかどうかのチェックを行う

認証済みかどうかを確認し、ログイン認証前ならログインフォームへ移動するロジックを作ります。

ここでは、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

認証前にtest_a.phpにアクセスした場合。

loginChek.phpの判定により、ログインフォームへ移動

login_form

 

ログイン後の画面。リンクをクリックして、元ページへ移動

login_success

 

直接ログインページにアクセス、認証した場合。戻り先リンクが表示されない。

login_noreturm

 

必要に応じて「◯秒後に移動」など、リダイレクト処理を行うのもよいかなーと考えています。

 

次回は、ここまでのまとめ

次回は、勉強記録がちょうど10回目になることもあり、これまでの整理を行う予定です。

合わせて、PHPとPEARを勉強した上で感じたことを、自分宛のメモとして記録しておこうと思います。