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>