Pearでユーザ認証(Auth)

更新日2008-11-13 (木) 16:35:56

Authパッケージのインストール

PHPサンプル

PearのAuthでユーザ認証を行い、その認証を別ページに継続する。また認証データベースはMysqlを使用する。MySQLではパスワードmd5でパスワードはハッシュした値を使用する。

認証に利用できるストレージの種類

ストレージの種類ストレージドライバ名
データベースDB
ファイルFile
SMBPasswdSMBPasswd
IMAPIMAP
LDAPLDAP
POP3POP3
RADIUSRADIUS
SOAPSOAP
vpopmailvpopmail

今回は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>

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS