【PHP】認証について

Basic認証

サンプル

<?php
$user = "admin";
$password = "pass";

if (!isset($_SERVER["PHP_AUTH_USER"])) {
	// クライアントのブラウザ上の認証画面が表示される
	header("WWW-Authenticate:Basic realm='PrivatePage'" );
	header("HTTP/1.0 401 Unauthorized" );
	die("このページを見るには、ログインが必要です" );
} else {
	if ($_SERVER["PHP_AUTH_USER"] != $user
	|| $_SERVER["PHP_AUTH_PW"] != $password) {
		// クライアントのブラウザ上の認証画面が表示される
		header("WWW-Authenticate:Basic realm='PrivatePage'" );
		header("HTTP/1.0 401 Unauthorized" );
		die("このページを見るには、ログインが必要です" );
	}
}
?>
<html>
<body>
認証成功
</body>
</html>
?>

補足

isset()

変数がセットされているかどうかをチェック

セッション管理認証

 * セッション変数を使って、認証を管理する。

サンプル

login.html

<HTML>
<body>
<form action="authentication.php" method="POST">
        ID : <input type="text" size="20" name="id"><br>
        パスワード : <input type="password" size="20" name="password"><br>
        <input type="submit" value="Login">
        <input type="reset" value="Reset">
</form>
</body>
</html>

authentication.php

<?php
try
{
$connectionId = mysql_connect("XXXXX:1000", "dataBaseName", "passowrd") or die(mysql_error());
mysql_select_db('dataBaseName') or die(mysql_error());

// 値を取得する
$email = $_POST["email"];
$password = $_POST["password"];

// 未入力チェック
if ($email == null || $email == "" || $password == null || $password == "")
{
	// エラーの場合、error.phpに遷移する
	echo "Error...";
	exit();
}

// セッション開始
session_start();
// セッション変数の初期化
$_SESSION = array();

// SQL クエリを実行
$sql = "SELECT employeId FROM employe WHERE email='" . $email . "' AND password = '" . $password . "'";
$result = mysql_query($sql) or die(mysql_error());
$count = mysql_num_rows($result);

if ($count == 1)
{
	// 認証成功
	
	$row = mysql_fetch_row($result);
	$loginId = $row[0];
	
	// セッション変数の登録
	$_SESSION["id"] = $loginId;
	
	// 開放処理(セッションは開放しないこと)
	mysql_free_result($result);
	mysql_close($connectionId);
	
	// index.phpに遷移
	header("LOCATION:index.php");
	exit();
}
else if ($count > 1)
{
	// ユーザ名が重複している
	
	// 開放処理
	session_destroy();
	mysql_free_result($result);
	mysql_close($connectionId);
	
	echo "Error...";
	exit();
}
else
{
	// 開放処理
	session_destroy();
	mysql_free_result($result);   
	mysql_close($connectionId);
	
	// IDとパスワードがDBで一致しない場合、mismatch.htmlに遷移する
	echo "Mismatch...";
	exit();
}
}
catch (Exception $e)
{
// 例外処理
echo "Error : " . nl2br($e->getMessage()) . "\n";
exit();
}
?>

index.php

<html>
<body>
<?php
mb_language("Japanese");
mb_internal_encoding("UTF-8");
mb_detect_order("ASCII, UTF-8, Shift_JIS, JIS, EUC-JP");

// セッション開始
session_start();

if (!isset($_SESSION["id"]) || $_SESSION["id"] == null || $_SESSION["id"] === "")
{
	// 認証されていないため、ログイン画面
	header("LOCATION:login.html");
	exit();
}

// idを設定する
$id = $_SESSION["id"];

try
{
$connectionId = mysql_connect("XXXXX:1000", "dataBaseName", "passowrd") or die(mysql_error());
mysql_select_db('dataBaseName') or die(mysql_error());

// SQL クエリを実行
$sql = "SELECT name FROM person WHERE id='" . $id . "'";
$result = mysql_query($sql) or die(mysql_error());
$count = mysql_num_rows($result);

if ($count == 1)
{
	// 認証成功
	$row = mysql_fetch_row($result);
	$name = $row[0];
	
	// 開放処理(セッションは開放しないこと)
	mysql_free_result($result);   
	mysql_close($connectionId);
	
	// IDとパスワードがDBで一致した場合、idの値を持ってmain.phpに遷移する
	echo "ようこそ、" . $name . "さん";
	exit();
}
else
{
	// 開放処理
	session_destroy();
	mysql_free_result($result);   
	mysql_close($connectionId);
	
	echo "Error...";
	exit();
}
}
catch (Exception $e)
{
echo "Error : " . nl2br($e->getMessage()) . "\n";
}
?>

</body>
</html>