導入
Authについてのチュートリアル
この"ミニチュートリアル"では、
簡単な認証機構を利用してシステムを構築し、
サイトをセキュアにすることを目標とします。
セキュアにしたいサイトのはじめに、以下の短いコードを置いてください。
例 28-1PEAR::Authの典型的な使用例
<?php
require_once "Auth/Auth.php";
function loginFunction()
{
/**
* HTML出力は、作成するアプリケーションに合うように、
* 変更してください。
*/
echo "<form method=\"post\" action=\"" . $_SERVER['PHP_SELF'] . "\">";
echo "<input type=\"text\" name=\"username\">";
echo "<input type=\"password\" name=\"password\">";
echo "<input type=\"submit\">";
echo "</form>";
}
$dsn = "mysql://user:password@localhost/database";
$a = new Auth("DB", $dsn, "loginFunction");
$a->start();
if ($a->getAuth()) {
/**
* サイトの出力はここ。
*/
}
?>
|
このような短いコードでも、認証システムを実現できています。
最初の行では、PEARディレクトリからファイルを読み込んでいます。
そのファイルには、PEAR::Auth
の実行に必要なコードが全て含まれています。
次に、ページの閲覧者がログインデータを入力するために使用する
ログインフォームを表示する関数を定義します。
この関数のHTML
フォーマットは自由に変更することが出来ます。
| 警告 |
関数中のHTMLフォーマットは自由に変更できますが、
入力欄の名称は変更してはいけません。
それらは、
usernameおよびpassword
とする必要があります。
|
この例では、ログインデータの検証にデータベースを使用するので、
変数$dsnを作成します。
この変数には、
PEAR::DB
によるデータベース接続に使われる有効なDSN文字列を指定します。
デフォルトのテーブルスキーマについて、および
データベース以外のストレージコンテナを使用する方法については、
後述の説明を参照下さい。
その後、認証オブジェクトを作成します。
はじめの引数には、ストレージコンテナ名を指定します。
ここでは、データベースによるストレージコンテナを使用するので、
"DB"を渡します。
2番目には、使用するストレージコンテナのドライバへの
コネクション引数です。
ここでは、定義済のDSN文字列を使います。
3番目の引数は、ログインフォームを表示する関数名です。
ついで、認証オブジェクトを初期化します。そして、
ユーザがログインしているかどうか調べる必要があります。
これは、getAuth()メソッドにより行います。
TRUEが返されると、ページの内容をユーザに示すことができます。
| 警告 |
現在のところ、register_globals=onの場合、以下のコードは使用できません。
<?php
$auth = new Auth(...);
?>
|
その理由は、$authが、PEAR::Auth内部で使用されている
セッション変数名であるためです。
|
|
例 28-2認証の選択的な使用
<?php
require_once "Auth/Auth.php";
function loginFunction()
{
/**
* HTML出力は、作成するアプリケーションに合うように、
* 変更してください。
*/
echo "<form method=\"post\" action=\"" . $_SERVER['PHP_SELF'] . "?login=1\">";
echo "<input type=\"text\" name=\"username\">";
echo "<input type=\"password\" name=\"password\">";
echo "<input type=\"submit\">";
echo "</form>";
}
if (isset($_GET['login']) && $_GET['login'] == 1) {
$optional = true;
} else {
$optional = false;
}
$dsn = "mysql://user:password@localhost/database";
$a = new Auth("DB", $dsn, "loginFunction", $optional);
$a->start();
echo "すべての人がこのテキストを読めます。<br />";
if (!isset($_GET['login'])) {
echo "<a href=\"test.php?login=1\">ログイン</a>\n";
}
if ($a->getAuth()) {
echo "ログインした人だけが、ここを見れます。";
}
?>
|
上記は、ログイン機能を選択的に使用する例です。
最後の$optionalパラメータは、
TRUEまたはFALSEとします。
FALSEとした場合、ログインフォームは表示されず、
ユーザは「すべての人がこのテキストを読めます。」
の文だけを見ることができます。
もし、ユーザがこのページ上部のリンクをクリックすると、
GETパラメータが"login=1"となって、同じページに接続します。
今回は、ログイン情報をログインフォームに入力できます。
ログインに成功すると、
「すべての人がこのテキストを読めます。」の文と
「ログインした人だけが、ここを見れます。」
の文の両方を見ることができます。
|
例 28-3ログアウト機能
以下の例では、現在のユーザをログアウトさせ、
ログインフォームを再び表示します。
<?php
if ($_GET['action'] == "logout" && $myauth->checkAuth()) {
$myauth->logout();
}
$myauth->start();
?>
|
|
以下では、PEAR::Authの機能についての
詳細を示します。
次のSQL文は、MySQLを使用して、
データベース認証用のデフォルトのスキームを作成します。
CREATE TABLE auth (
username VARCHAR(50) default '' NOT NULL,
password VARCHAR(32) default '' NOT NULL,
PRIMARY KEY (username),
KEY (password)
); |
認証を機能させるために必要なテーブル名とフィールド名が示されています。
PEAR::Auth のデフォルトの暗号化方式である MD5
アルゴリズムでパスワードのハッシュ値を計算する場合、
password カラムは、32文字以上とする必要があります。
他の暗号化方式、たとえばDES ("UNIX
crypt") など、を使用する場合は、
それに合わせてカラムサイズを変更する必要があります。