*Pearでユーザ認証(Auth) [#w2cb39db]
RIGHT:更新日&lastmod();
**Authパッケージのインストール [#r1f997b9]
[[ここを見る>Web Memo/PukiWikiプラグイン(RSS)+PEAR]]
**PHPサンプル [#d0ff9d41]
PearのAuthでユーザ認証を行い、その認証を別ページに継続する。また認証データベースはMysqlを使用する。MySQLではパスワードmd5でパスワードはハッシュした値を使用する。
''認証に利用できるストレージの種類''~
|ストレージの種類 |ストレージドライバ名 |
|データベース |DB |
|ファイル |File |
|SMBPasswd |SMBPasswd |
|IMAP |IMAP |
|LDAP |LDAP |
|POP3 |POP3 |
|RADIUS |RADIUS |
|SOAP |SOAP |
|vpopmail |vpopmail |
今回はMySQLなので''DB''を指定。
***データベースの用意 [#w090d75e]
''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)
***認証画面 [#e87b4c67]
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("認証されていません");
}
?>
&color(red){''参考''};~
header("Location: http://www2.data-map.net/~okada/pear/next.php");
は文字が表示される前のヘッダー部相当に記述されないと動作しない。
またheader("Content-type: text/html;charset=UTF-8");も<html>タグの前に必要
***認証後の画面 [#bafe85e5]
認証確認用共通部をまとめる
&color(red){コンストラクタを使って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>
***ログアウトページ [#xc4e8dd6]
''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()])) {
//第3パラメータは有効範囲のパスを指定この場合は /以下すべて
setcookie(session_name(), "", time()-42000, "/");
}
session_destroy();//セッションを破壊
echo "ログアウトされました <br>";
}else{
echo "認証されてません <br>";
}
?>
<a href="pearauthtest1.php">Loginページへ</a><Br>