導入

導入 – 使用例

Authについてのチュートリアル

この"ミニチュートリアル"では、 簡単な認証機構を利用してシステムを構築し、 サイトをセキュアにすることを目標とします。

セキュアにしたいサイトのはじめに、以下の短いコードを置いてください。

PEAR::Authの典型的な使用例

<?php
require_once "Auth.php";

// 三つの引数を受け取ります。それぞれ
// 直近にログインを試みたユーザ名、認証状態、そして Auth オブジェクトです。
// このシンプルなデモではこれらを使用しませんが、ちゃんとした処理を
// 書く際には必要となるでしょう。
function loginFunction($username null$status null, &$auth null)
{
    
/*
     * HTML出力は、作成するアプリケーションに合うように、
     * 変更してください。
     */
    
echo "<form method=\"post\" action=\"test.php\">";
    echo 
"<input type=\"text\" name=\"username\">";
    echo 
"<input type=\"password\" name=\"password\">";
    echo 
"<input type=\"submit\">";
    echo 
"</form>";
}

$options = array(
  
'dsn' => "mysql://user:password@localhost/database",
  );
$a = new Auth("DB"$options"loginFunction");

$a->start();

if (
$a->checkAuth()) {
    
/*
     * サイトの出力はここ。
     */
}
?>

このような短いコードでも、認証システムを実現できています。

最初の行では、PEARディレクトリからファイルを読み込んでいます。 そのファイルには、PEAR::Auth の実行に必要なコードが全て含まれています。 次に、ページの閲覧者がログインデータを入力するために使用する ログインフォームを表示する関数を定義します。 この関数のHTML フォーマットは自由に変更することが出来ます。

この例では、ログインデータの検証にデータベースを使用するので、 変数$dsnを作成します。 この変数には、 PEAR::DB によるデータベース接続に使われる有効なDSN文字列を指定します。 デフォルトのテーブルスキーマについて、および データベース以外のストレージコンテナを使用する方法については、 後述の説明を参照下さい。

その後、認証オブジェクトを作成します。 はじめの引数には、ストレージコンテナ名を指定します。 ここでは、データベースによるストレージコンテナを使用するので、 "DB"を渡します。 2番目には、使用するストレージコンテナのドライバへの コネクション引数です。 ここでは、定義済のDSN文字列を使います。 3番目の引数は、スクリプトの最初で定義した関数の名前です。 この関数は、ログインフォームを表示します。

ついで、認証オブジェクトを初期化します。そして、 ユーザがログインしているかどうか調べる必要があります。 これは、checkAuth()メソッドにより行います。 TRUEが返されると、ページの内容をユーザに示すことができます。

認証の選択的な使用

<?php
// ここでは、ファイルの名前が "test.php" であるとします

require_once "Auth.php";

function 
loginFunction()
{
     
/*
      * HTML出力は、作成するアプリケーションに合うように、
      * 変更してください。
      */
     
echo "<form method=\"post\" action=\"test.php?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;
}

$options = array(
  
'dsn' => "mysql://user:password@localhost/database",
  );
$a = new Auth("DB"$options"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"となって、同じページに接続します。 今回は、ログイン情報をログインフォームに入力できます。 ログインに成功すると、 「すべての人がこのテキストを読めます。」の文と 「ログインした人だけが、ここを見れます。」 の文の両方を見ることができます。

ログアウト機能

以下の例では、現在のユーザをログアウトさせ、 ログインフォームを再び表示します。

<?php
$myauth
->start();
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") など、を使用する場合は、 それに合わせてカラムサイズを変更する必要があります。

Auth (Previous) Auth の挙動を制御するオプション (Next)
Last updated: Fri, 19 Sep 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: marty@pagemiller.com
In the mini-tutorial, there is a section on optional authentication.

The var named $optional should be renamed $required.

The way the demo works, if $optional is true and is used as the fourth parameter, then login is required.

If you named the fourth parameter $required, and if it was false, login would not be required.

The variable name would make more sense to be named $required. Because if it is false, login is not required.

Just my $.02.
Note by: Happy_User
To Frustrated_User:

You're lack of using the Log functions is likely the only problem you have. I had the same issue as you. I turned on the Logging and voila! There was the problem!

(My table name was "Auth" and it was trying to use "auth" -- duh!)
Note by: Frustrated_User
Somehow I think your documentation lacks some essential points, I just get status -3 all the time (authentication failure), the database connection seems to work when I look at the print_r output from the Auth object. I don't get any error messages from the class nor from PHP itself, great job on making debugging easy, my compliments to you (and no, I don't want to use the PEAR::Log class, thanks).

The least thing you guys should do is update the example to use MDB2 instead of DB, I mean come on - how hard is that?? That's obviously the first thing everybody stumbles across.
Note by: niklas@...
A quick FYI for people who want to use the Auth package in a class and use a custom login function. Take the following example:

You have your userclass from which you call the Auth package. You want to use a function from your class as a custom login handler.

Auth.php uses PHPs is_callable to check if the function exists so it might be good to read up on http://php.net/manual/en/function.is-callable.php

The login-function variable can take an array if you need to call a certain class:

array($classreference, 'yourfunction')

I.e:

array($this, "loginFunction")

Or:

new Auth('MDB2', $this->options, array($this, "loginFunction"), $forcelogin);
Note by: chris@tactek.com
Not to be contrary, but the statement in the documentation that "...the MD5 algorithm...is the default encryption..." is a misnomer. Hashing is not encryption. Googling for "hashing is not encryption" will return numerous articles on this common misconception.
Note by: compufreak.info
ts@websafe.pl asked:

Isn't there an error?

$options = array(
'dsn' => "mysql://user:password@localhost/database",
);

right after /database", the comma is not needed, or am I wrong?

-----------------------

This is correct. The comma is not needed. But it is perfectly 'legal'! You may add a Comma after the last array-element. only, because if you add more elements, you won't forget the comma between the old element and the first new element. it will work and it is okay!
Note by: cronimson@yahoo.com
example does not work and i have in the internet for examples and all of them does not work also. can someone post a working sample.. this is frustrating.
Note by: wiesemann
@shelleykm..., please use the support offers on pear.php.net for asking support questions. About the usage of DB here: The example is just a little bit older. If you have suggestions about how it could be improved, please open a bug report via the link that is offered on the footer of this page (next to the link that you've used to file your user note).
Note by: wiesemann
@ts..., the comma isn't needed, that's right. But this isn't an error. PHP accepts the comma, and it makes people's life easier in some sense because you don't have to worry about adding the comma if you add another key/value pair to the $options array.
Note by: ts@websafe.pl
Isn't there an error?

$options = array(
'dsn' => "mysql://user:password@localhost/database",
);

right after /database", the comma is not needed, or am I wrong?
Note by: shelleykm@adelphia.net
Thanks to the above poster for the encryption hint. Unfortunately I don't have it working yet.

Also, why is the "DB" connector listed here? In the PEAR doc it even says DB has been deprecated in favor of MDB2. Why give newbies examples with includes that aren't recommended to use anymore?
Note by: Mario
Just adding one clarification for newbies (as I am).

If you want to test the 2 examples, don't forget that the password in your table must be encrypted.