*Pearでユーザ認証(Auth) [#w2cb39db] RIGHT:更新日&lastmod(); **Authパッケージのインストール [#r1f997b9] **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>