忍者ブログ
バナヤンの忍者風呂
忍者ブログのカスタマイズ、各種WEBツールのテストなど試行錯誤の日々。 VMLによる地図の作成を研究していましたが、一時中断して、今はPHPを勉強しているところです。
ニュース
この欄には、このブログの内容に関連するニュースを掲載する予定です。
お知らせ
この欄には管理人からのお知らせなどを掲載します。
[38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

PHP ログイン管理1

PHPでログイン管理しましょう。

単独のページへのアクセス制限について、これまで「シークレットページ 」から「PHP ユーザーパスワード2:ユーザーid」に至まで記事にしてきました。これはこれで使いようはあると思いますが、メンバーサイトでは、一度ユーザーの認証をしたら、複数のページを見れるようにしないと不便です。この最初のユーザー認証を「ログイン」と呼び、ユーザー認証に関係する一連の手続を「ログイン管理」と呼ぶことにしましょう。

ログインされた人しか見れないページは、次のような判断を最初にしています。
1.ログインしている人からのアクセスかどうか。
2.ログインしてない人からのアクセスであれば、所定のページに飛ばす。
 (あるいは、エラーメッセージを表示する)
3.ログインしている人からのアクセスならば、そのページを表示する。
 (あるいは次のステップを処理する)

これはPHPで、どのように実現すればいいのでしょう。

PHPには、「$_SESSION」というスーパーグローバル変数があります。「$_SESSION」はセッションを管理する変数です。セッションを始めたときにサーバーは、セッションidを発行し、これをユーザーに送信し、原則的にはCOOKIEに書き込みます。このセッションidを持った人からのアクセスをサーバー側で同一のものとみなすという仕組みのようです。

まず、ログインのユーザーidとパスワードを入力するページを見てみましょう。基本的には、「ユーザーパスワード2」で示したものと同じですが、HTML文書ではなく、PHP文書としています。それは、すでにログインしている人がこのページにアクセスしても無駄なので、その場合は特定のページ(「login1-3.php」)に飛ばす記述を最初に入れたからです。

[ソース]login1-1.php

<?php
session_start();
if($_SESSION["usrid"]){
header("Location:login1-3.php");
exit;
}
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
?>
<html>
<head>
<title>ログイン1</title>
</head>
<body>
<form action='login1-2.php' method='post'>
ユーザーid:<input type='text' name="usrid">
パスワード:<input type='password' name="pwd">
<input type='submit' value="送信">
</form>
<p>すでにログインされている場合は、
このページは表示されず、login1-3.phpへ飛びます。</p>
<p>ユーザーidとして「a,b,c,d,e,f,g,h」のいずれか、
パスワードとして「pwda」というようにユーザーidの前に「pwd」つけて送信すれば、
目的のページが見れます。</p>
<p>それ以外は、このページに戻ってきます。</p>
<p>なお、ユーザー「z」、パスワード「pwdz」はパスワードリストに記載されていますが、
3番目のフィールドに「0」が記載されているため、条件外となります。
3番目のフィールドが「0」のものは、無効とする扱いにしています。
<p>送信先のページでは、パスワードのリストのファイルを読み込み、
これをfile関数で1行ずつ配列に格納します。
そのの1行は、「ユーザーid」「パスワード」「クラス」の3つの項目が記載されています。
送信された「ユーザーid」と「パスワード」が、共にこのファイル上の「ユーザーid」「パスワード」と一致し、
さらに「クラス」が「0」出ない場合に「条件」を「真」とします。
一致しなければ、次の配列と比較します。
最後の配列までいっても値が一致しないときは「条件」に値がなく、「偽」ということになります。
「偽」の場合には、このパスワード送信ページに戻します。</p>
<hr>
</body>
</html>


「session_start();」でセッションをスタートします。
次の行で、$_SESSION["usrid"]に値が存在するか判断しています。ここに値があるということは、すでにログインしているということです。その場合には、「login1-3.php」に飛びます。「exit;]は、その場合には、以下を実行しないという意味です。ログインしてない場合には、以下が実行され、ログイン画面が表示されます。
「ユーザーid」と「パスワード」に入力された値をそれぞれ「usrid]と「pwd」という名前をつけて「login1-2.php」に送信します。

「login1-2.php」では、これを"pwd_list.php"というパスワードリストのファイルと比較して、有効ユーザーかどうかを判断します。有効ユーザーであれば、「login1-3.php」に飛ばします。有効ユーザー出ない場合には、ログイン画面のある「login1-1.php」に戻します。

[ソース]login1-2.php

<?php
session_start();
$line=file("pwd_list.php");
foreach($line as $password){
$password = str_replace("?",microtime(),$password);
$password = str_replace("\r","",$password);
$password = str_replace("\n","",$password);
$password = explode(",", $password);
if($password[0]==$_POST["usrid"]&&$password[1]==$_POST["pwd"]&&$password[2]!="0"){
$_SESSION["usrid"] = $_POST["usrid"];
header("Location:login1-3.php");
exit;
}
}
header("Location:login1-1.php");
exit;
?>


ユーザーパスワードリストは、「ユーザーパスワード2」のものファイル名を変えただけのものです。

[ソース]pwd_list.php

<?php
a,pwda,1
b,pwdb,1
c,pwdc,1
d,pwdd,1
e,pwde,1
f,pwdf,1
g,pwdg,1
h,pwdh,1
z,pwdz,0
?>


ログインした人が最初に行くページを「login1-3.php」にしています。
このページの最初に「$_SESSION["usrid"]」に値がない人は、ログインページに戻るという記述をしています。
この後の記述は自由でかまいませんが、ここでは、「$_SESSION["usrid"]」を表示し、次のページへのリンクとログアウトボタンを用意しています。ログアウト処理については、次回説明します。次のページ「login1-4.php」へいっても、「$_SESSION["usrid"]」が保持されていることを確認できます。

[ソース]login1-3php

<?php
session_start();
if(!($_SESSION["usrid"])){
header("Location:login1-1.php");
exit;
}
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
?>
<html>
<head>
<title>ログイン1:ログイン後ページ</title>
</head>
<body>
$_SESSION["usrid"]=<?= $_SESSION["usrid"]; ?>
<form method='post' action='login1-e.php'>
<input type='submit' name='logout' value='logout'>
</form>
<br>
<a href="login1-4.php">Next Page</a><br>
</body>
</html>


[ソース]login1-4.php

<?php
session_start();
if(!($_SESSION["usrid"])){
header("Location:login1-1.php");
exit;
}
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate");
?>
<html>
<head>
<title>ログイン1:ログイン後ページ2</title>
</head>
<body>
$_SESSION["usrid"]=<?= $_SESSION["usrid"]; ?>
<form method='post' action='login1-e.php'>
<input type='submit' name='logout' value='logout'>
</form>
<br>
<a href="login1-3.php">Prev Page</a><br>
</body>
</html>


PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード
QRコード
忍者ブログ [PR]
Copyright (C) 2006 banayan ALL RIGHTS RESERVED.