ログイン・ログアウト

今回はログイン・ログアウトの仕組みについて解説します。ログインフォームから入力したユーザ名・パスワードが正しければログインした状態となり、ログインしたユーザのみが閲覧できるページを作ってみましょう。ただし、今回解説する内容はかなり簡易的ですので、個人情報など漏洩すると問題となるような情報を保持している場合などにはおすすめできません。

ログインフォーム

ログインしていない状態であればユーザ名・パスワードの入力フォームを、そうでなければログアウトのためのリンクが表示される仕組みとなります。ここではこのファイルを「form.php」という名前で保存します。

スクリプト

<?php
	session_start();
	if($_COOKIE['ponta-php'] == 'ponta-php member' || \
	$_SESSION['ponta-php'] == 'ponta-php member'){
		if(isset($_COOKIE['ponta-php'])){
			$cookiename = 'ponta-php';
			$cookieval = 'ponta-php member';
			$cookietimeout = time() + 30 * 24 * 60 * 60;
			setcookie($cookiename, $cookieval, $cookietimeout, '/');
		}
		$cookiename = 'ponta-php';
		$cookieval = 'ponta-php member';
		$cookietimeout = time() + 30 * 24 * 60 * 60;
		setcookie($cookiename, $cookieval, $cookietimeout, '/');
?>
		<p>a href="/login/logout.php">ログアウト</a></p>
<?php
	}else{
?>
	<form name="loginform" action="/login/login.php" method="post">
	<label for="username">ユーザ名:</label>
	<input type="text" size="12" name="username" id="username" /><br />
	<label for="password">パスワード:</label>
	<input type="password" size="12" name="password" id="password" /><br />
	<input type="checkbox" name="persistent" id="persistent" />
	<label for="persistent">次回から入力を省略</label>
	<input type="submit" name="submit" value="ログイン" />
	</form>
<?php
}
?>

実行結果

こちらのサンプルよりご覧ください。

解説

session_start()
セッション使用の宣言をしています。HTMLの出力より先に記述する必要があります。
if($_COOKIE['ponta-php'] == "ponta-php member" || $_SESSION['ponta-php'] == 'ponta-php member'){ … }
if構文の条件分岐で「$_COOKIE['ponta-php'] == 'ponta-php member'」と「$_SESSION['ponta-php'] == 'ponta-php member'」のどちらかがTRUEであればすでにログイン済みとして[ }内の処理を実行します。
if(isset($_COOKIE['ponta-php'])){ … }
前回のログインで「次回からIDの入力を省略」にチェックを入れた人には、「ponta-php」という名前のクッキーを渡しています。このクッキーを保持している場合は[ }内の処理を実行します。
setcookie($cookiename, $cookieval, $cookietimeout, '/')
すでにクッキーを保持している人に新たなクッキーをsetcookie関数でセットしています。これは今回の訪問から30日間クッキーの有効期限を延長するための処理です。なおsetcookie関数の引数は、setcookie(クッキー名、クッキーに書き込む値、クッキーの有効期限、クッキーを有効としたいパス)となっています。
elseif($_SESSION['ponta-php'] == 'ponta-php member'){ … }
前回のログインで「次回からIDの入力を省略」にチェックを入れていない人には、セッションによる認証によりブラウザを閉じた時点でログインの状態が無効になります。

ログイン処理

ユーザ名・パスワードが正しいかどうかを判定し、正しいと判定されればログインのための処理を実行します。ここではこのファイルは「login.php」という名前で保存します。

スクリプト

<?php
	session_start();
	ini_set('session.use_only_cookies', 1);
	ini_set('session.use_cookies', 1);
	ini_set('session.use_trans_sid', 0);
	$username = $_POST['username'];
	$password = $_POST['password'];
	if($username == 'username' && $password == 'password'){
		if($_POST['persistent']){
			$cookiename = 'ponta-php';
			$cookieval = 'ponta-php member';
			$cookietimeout = time() + 30 * 24 * 60 * 60;
			setcookie($cookiename, $cookieval, $cookietimeout, '/');
		}else{
			$_SESSION['ponta-php'] = 'ponta-php member';
		}
		header('Location: /member/index.php');
		exit();
	}else{
		header('Location: /login/form.php');
		exit();
	}
?>

解説

$username = $_POST['username']
フォームからポストで送信された値はグローバル変数「$_['フォーム部品名']」に格納されていますのでそれを変数に代入しています。
if($username == 'username' && $password == 'password'){ … }
今回はとりあえずユーザ名を「username」、パスワードを「password」とし、ユーザ名・パスワードとも一致していたら{ }内の処理を実行します。
if($_POST['persistent']){ … }
ログインフォームの「次回から入力を省略」にチェックが入っている場合に{ }内の処理を実行します。今回は有効期限が30日のクッキーをクライアントに渡しています。
else{ … }(14行目)
ログインフォームの「次回から入力を省略」にチェックが入っていない場合に{ }内の処理を実行します。今回はグローバル変数「$_SESSION['ponta-php']」に値を代入しています。$_SESSIONはブラウザを開いている間のみ有効になるので、一旦ブラウザを閉じた際には再度ログインのための入力を求められます。
header('Location: /member/index.php')
header関数で「/member/index.php」にリダイレクトしています。header関数もHTML出力前に実行する必要がありますが、当ファイルではHTMLの出力がないので記述位置には気を遣う必要がありません。ここでは仮定のメンバー用ページ「/member/index.php」を指定していますが、サンプルでは「form.php」にリダイレクトしています。
exit()
すべての処理を終了にする関数です。
else{ … }(20行目)
ユーザ名、パスワードが一致していなかったときの処理です。「form.php」にリダイレクトしています。

ログアウト処理

ログアウトするための一連の処理です。

スクリプト

<?php
	session_start();
	ini_set('session.use_only_cookies', 1);
	ini_set('session.use_cookies', 1);
	ini_set('session.use_trans_sid', 0);
	if(isset($_COOKIE['ponta-php'])){
		$cookiename = 'ponta-php';
		$cookieval = 'ponta-php member';
		$cookietimeout = time() - 1800;
		setcookie($cookiename, $cookieval, $cookietimeout, '/');
	}
	$_SESSION = array();
	if(isset($_COOKIE['PHPSESSID'])){
		setcookie('PHPSESSID', '', time() - 1800, '/');
	}
	session_destroy();
	header("Location: /login/form.php");
	exit();
?>

解説

メールフォームの最後の処理とほぼ同じ処理を実行しています。「$_COOKIE」は有効期限に過去の時間をセットし無効にします。「$_SESSION」についてはarray()で配列を空にしたのち、session_destroy関数でセッションを破壊しています。

ログインしているときのみページを見せる処理

if構文の条件分岐で「ponta-php」という名前のクッキーまたはセッション変数をもっている場合のみページを表示させ、それ以外の人はログインフォームにリダイレクトします。

スクリプト

<?php
session_start();
	if($_COOKIE['ponta-php'] == 'ponta-php member' || \
	$_SESSION['ponta-php'] == 'ponta-php member'){
		<ここにログインした人のみ閲覧可能なページの内容を記述するか、そのページにリダイレクトします。>
	}else{
		header("Location: /login/form.php");
		exit();
	}
?>

▲ページトップに戻る