PearのAuthでユーザ認証を行い、その認証を別ページに継続する。また認証データベースはMysqlを使用する。MySQLではパスワードmd5でパスワードはハッシュした値を使用する。
認証に利用できるストレージの種類
ストレージの種類 | ストレージドライバ名 |
データベース | DB |
ファイル | File |
SMBPasswd | SMBPasswd |
IMAP | IMAP |
LDAP | LDAP |
POP3 | POP3 |
RADIUS | RADIUS |
SOAP | SOAP |
vpopmail | vpopmail |
今回はMySQLなのでDBを指定。
md5でハッシュ
$ echo -n '*****' | md5sum ****************61d7************ -
DB名: authdb
DBユーザ名: ism
パスワード: ******
mysql> select * from t_auth; +----------+----------------------------------+ | username | password | +----------+----------------------------------+ | test | ****************61d7************ | +----------+----------------------------------+ 1 row in set (0.00 sec)
Auth/Auth.php:Pearモジュールが入っているので必ず指定が必要
function loginFunction($username, $status):
ログインフォームの書式指定。ない場合はデフォルトが表示される。
$params:この配列にデータベース、テーブル、先のログインフォームの要素の名前をクラスに渡す内容を記述
new Auth("DB", $params, "loginFunction");
コンストラクタを使ってAuthクラスを作成。第1パラメータ=>ストレージドライバ名
第2パラメータ=>先の配列。第3パラメータ=> 先のログインフォームの関数
pearauthtest1.php
<?php header("Content-type: text/html;charset=UTF-8"); require_once "Auth/Auth.php"; function loginFunction($username, $status){ print("<form method=\"post\" action=\"pearauthtest1.php\">"); print("<table>"); print("<tr>"); print("<td>ユーザー名</td>"); print("<td><input type=\"text\" name=\"username\"></td>"); print("</tr>"); print("<tr>"); print("<td>パスワード</td>"); print("<td><input type=\"password\" name=\"password\"></td>"); print("</tr>"); print("<tr>"); print("<td colspan=\"2\"><input type=\"submit\"></td>"); print("</tr>"); print("</table>"); print("</form>"); } $params = array( "dsn" => "mysqli://****:ism@192.168.30.16/authdb", "table" => "t_auth", "usernamecol" => "username", "passwordcol" => "password" ); $authobj = new Auth("DB", $params, "loginFunction"); $authobj->start(); print("認証開始後、処理はすぐ次へ移り、この部分も表示されます <Br>"); if ($authobj->getAuth()){ // header("Location:http://www2.data-map.net/~okada/pear/next.php"); print("認証済みです <br>"); echo "<a href=\"next.php\">次の画面</a> <br>"; }else{ print("認証されていません"); } ?>
参考
header("Location: http://www2.data-map.net/~okada/pear/next.php");
は文字が表示される前のヘッダー部相当に記述されないと動作しない。
またheader("Content-type: text/html;charset=UTF-8");も<html>タグの前に必要
認証確認用共通部をまとめる
コンストラクタを使ってAuthクラスを作成時第4パラメータにfalseを指定すると見認証時にログインフォームが表示されない.
authtest.php
<?php // 認証確認用ルーチン require_once "Auth/Auth.php"; $params = array( "dsn" => "mysqli://ism:ism@192.168.30.16/authdb" ); //第3パラメータは空白のときは内部定義すみのフォームを利用するので必要ない //また、すでに入力された内容はSession管理され、引き継がれるので前ページとおなように //認証チェックできる。 第4パラメータにfalseを指定すると見認証時にログインフォームが //表示されない $authobj = new Auth("DB", $params, "", false); $authobj->start(); ?>
認証後のページ
next.php
<?php header("Content-type: text/html;charset=EUC-JP"); ?> <html> <head> <title>PHP認証テスト</title> </head> <body> <?php require_once ("authtest.php"); if (!$authobj->getAuth()){ echo "認証されていません <Br>"; exit; } ?> <H3>2ページ目</H3> 認証すみ<Br> <a href="logout.php">Logout</a><Br> </body> </html>
logout.php
<?php header("Content-type: text/html;charset=EUC-JP"); ?> <html> <head> <title>Logout</title> </head> <body> <?php require_once ("authtest.php"); if ($authobj->getAuth()){ $authobj->logout(); $_SESSION=array();//セッションを初期化* /* セッションクッキーを無効にする */ if (isset($_COOKIE[session_name()])) { setcookie(session_name(), "", time()-42000, "/"); } session_destroy();//セッションを破壊 echo "ログアウトされました <br>"; }else{ echo "認証されてません <br>"; } ?> <a href="pearauthtest1.php">Loginページへ</a><Br>