このサイトはPHPを独習する際に作成したスクリプトを基に、プログラム言語初心者のための入門講座として作成しました。PHPは初心者に親しみやすく、解りやすいプログラム言語です。これからプログラムを学ぶ人の参考になればと思います。
15-1 アクセス認証:ユーザー名とパスワードのダイアログを表示
もっともよく見られるユーザー認識システムです。 単純なパスワードシステムなら日記帳でやったように、条件分岐を使って表示内容に制限をかければ良いのですが、新たにダイアログボックスが出てきてそこに入力するタイプのパスワードシステムです。 ユーザー名とパスワードをはtextファイルから読みこみ、数種類の組み合わせでログインできるようになっています。 ログインすると新規にユーザー名とパスワードを登録できるようにしてみました。ちょっと複雑で、解りづらいスクリプトになってしまった気がしますが・・・ 先ずはこれがダイアログを出す命令です。
header('WWW-Authenticate: Basic realm="wakaran"'); header('HTTP/1.0 401 Unauthorized');
この時1、キャンセルする。2、間違ったID・PASSを入力する。3、正しいID・PASSを入力する。3つの判断が必要になります。同時に、3種のHTMLが必要になるので全体としてはちょっと見ずらいスクリプトになっています。 HTMLの部分はechoを並べても良いのですが、ヒュアドキュメントと言うものを使っています。これはecho <<<の後に任意の文字を入れ、最後に又同じ文字を記述するとその中ではHTMLが普通に使えるといいう仕組みなのです。この場合はERRですが何でもかまいません。最後のERR; が左にくっついているのは、タブをいれるとエラーになるからです。
echo <<<ERR <html lang="ja"><head> </head><body> アクセスに失敗しました。 </body></html> ERR;
IDとPASSはfgets を使ってファイルを読みこみます。 textファイルには次のように記入されています。読み込んだ文字は一行ずつ配列に格納していきます。
bird:0120 tree:0325 rain:4488
ダイアログで入力されたID・PASSが、配列に格納された組み合わせの中にあるかを、whileを使い順にチェックしていくわけです。 そのためにlist()とexplode()の2つの関数を使います。配列(例 bird:0120)はコロンで区切られているので、そこで分割し$id $pass という関数に代入します。
list($id,$pass) = explode(":",配列);
次にif と組み合わせ次の式で合致を判断します。rtrim()と言う関数はPASSの前後にある空白を削除するものなのです。なぜかPASSの後ろに空白が入ってしまうようです。
($_SERVER['PHP_AUTH_USER'] == $id) and ($_SERVER['PHP_AUTH_PW'] == rtrim($pass))
サンプルをクリックすると認証画面になるので、上記のID・PASSのどれかを入力すると認証されますが、キャンセルと違うPASSをいれてどうなるかを確認してください。一度認証されるとブラウザを終了するまでキャッシュに記憶しているようです。 認証が成功した画面になるとどのID・PASSで入ったかが表示され、新しくID・PASSを登録できるようになります。これも試してみてください。。
⇒こんな感じ |