PHPのPEAR::Authで質問があります。


以下の一般的なAuth認証処理において、実行時にユーザ名入力に指定値を自動的に入れ、
ユーザにはパスワードだけを入れるような仕組みを検討しております。
つまり、コンストラクタloginFunctionに値を渡し、****の場所にその値を入れるという意味です。
これで、パスワードだけを入力して認証ができるかどうかも問題ですが、
コンストラクタloginFunctionに値を渡す手段がなかなか実現できなく困っております。
方法について、ご教示いただきますようよろしくお願いいたします。

function loginFunction($username, $status) {
print("<form method=¥"post¥" action=¥"test.php¥">");
print("<input type=¥"text¥" name=¥"username¥" value=****>");
print("<input type=¥"password¥" name=¥"password¥">");
print("<input type=¥"submit¥">");
print("</form>");
}

$params = array(
"dsn" => "mysqli://user:pass@localhost/db",
"table" => "table",
"usernamecol" => "username",
"passwordcol" => "password"
);

$authobj = new Auth("DB", $params, "loginFunction");

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:
  • 終了:2010/11/01 23:32:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

【0】回答までの流れ

PEARを使ってという点が面白そうだったのでやってみる気になりました

最初はマニュアルを眺め直すところからはじめたのですがヒントになりそうなものは見当たらなかったですね

http://pear.php.net/manual/ja/package.authentication.auth.php

つぎにAuth.phpをダウンロードして中身をみると意外と簡単そうなので改造を試みました

http://pear.php.net/package/Auth/download/1.6.3

あとはデータベースの準備からはじまって改造前のコードでのテスト、そしてコード改造と続きました

 

【1】データベースの準備

通常であればusernameをプライマリキーとしますが、

すべて同一のものを使うということになりますのでpasswordをプライマリキーとしてテーブルを作成

(プライマリキーではなく重複不可のキーでもよかったかもしれません)

CREATE TABLE authtable (
   username VARCHAR(50) default '' NOT NULL,
   password VARCHAR(32) default '' NOT NULL,
   PRIMARY KEY (password),
   KEY (username)
);

サンプルとしてユーザー名はxyz、パスワードはabc,def,ghiの3つを準備しました

INSERT INTO authtable VALUES('xyz','900150983cd24fb0d6963f7d28e17f72');
INSERT INTO authtable VALUES('xyz','4ed9407630eb1000c0f6b63842defa7d');
INSERT INTO authtable VALUES('xyz','826bbc5d0522f5f20a1da4b60fa8c871');

 

【2】phpコードの変更

変更点は2点のみです

(1)loginFunction内からusernameテキストボックスを削除

(2)Auth.phpクラス変数へユーザー名を強制投入するコマンドを追加

補足

(a)私の環境ではcryptTypeパラメータが必要でしたが、そちらではご不要ということであれば削ってください

(b)MySQL接続文字列はmysqliではなくmysqlを使いましたが、これもそちらの環境に合わせてください

<?php
require_once "Auth/Auth.php";

function loginFunction(){
    print("<form method=\"post\" action=\"test.php\">");
    print("<input type=\"password\" name=\"password\">");
    print("<input type=\"submit\">");
    print("</form>");
}

$params = array(
    "dsn" => "mysql://user:pass@localhost/db",
    "table" => "authtable",
    "usernamecol" => "username",
    "passwordcol" => "password",
    "cryptType" => "md5"
);

$authobj = new Auth("DB", $params, "loginFunction");
$authobj->username = 'xyz';

// 以下はテスト用に追加:テストのため強制的にログアウトさせてます
$authobj->start();
if ($authobj->getAuth()) {
    echo "ようこそ";
} else {
    echo "ログインしてください";
}
$authobj->logout();
id:cochoo

ありがとうございます。

まだ試していないのですが、これなら目的を実現できそうです。また、オリジナルauthではできないということがわかったことも収穫です!

2010/11/01 09:37:18

その他の回答1件)

id:hgijgbnfhfg No.1

回答回数116ベストアンサー獲得回数0

(はてなにより削除しました)
id:cochoo

申し訳ありませんが、このようなご回答はご遠慮願います。

2010/11/01 01:07:02
id:windofjuly No.2

回答回数2625ベストアンサー獲得回数1149ここでベストアンサー

ポイント100pt

【0】回答までの流れ

PEARを使ってという点が面白そうだったのでやってみる気になりました

最初はマニュアルを眺め直すところからはじめたのですがヒントになりそうなものは見当たらなかったですね

http://pear.php.net/manual/ja/package.authentication.auth.php

つぎにAuth.phpをダウンロードして中身をみると意外と簡単そうなので改造を試みました

http://pear.php.net/package/Auth/download/1.6.3

あとはデータベースの準備からはじまって改造前のコードでのテスト、そしてコード改造と続きました

 

【1】データベースの準備

通常であればusernameをプライマリキーとしますが、

すべて同一のものを使うということになりますのでpasswordをプライマリキーとしてテーブルを作成

(プライマリキーではなく重複不可のキーでもよかったかもしれません)

CREATE TABLE authtable (
   username VARCHAR(50) default '' NOT NULL,
   password VARCHAR(32) default '' NOT NULL,
   PRIMARY KEY (password),
   KEY (username)
);

サンプルとしてユーザー名はxyz、パスワードはabc,def,ghiの3つを準備しました

INSERT INTO authtable VALUES('xyz','900150983cd24fb0d6963f7d28e17f72');
INSERT INTO authtable VALUES('xyz','4ed9407630eb1000c0f6b63842defa7d');
INSERT INTO authtable VALUES('xyz','826bbc5d0522f5f20a1da4b60fa8c871');

 

【2】phpコードの変更

変更点は2点のみです

(1)loginFunction内からusernameテキストボックスを削除

(2)Auth.phpクラス変数へユーザー名を強制投入するコマンドを追加

補足

(a)私の環境ではcryptTypeパラメータが必要でしたが、そちらではご不要ということであれば削ってください

(b)MySQL接続文字列はmysqliではなくmysqlを使いましたが、これもそちらの環境に合わせてください

<?php
require_once "Auth/Auth.php";

function loginFunction(){
    print("<form method=\"post\" action=\"test.php\">");
    print("<input type=\"password\" name=\"password\">");
    print("<input type=\"submit\">");
    print("</form>");
}

$params = array(
    "dsn" => "mysql://user:pass@localhost/db",
    "table" => "authtable",
    "usernamecol" => "username",
    "passwordcol" => "password",
    "cryptType" => "md5"
);

$authobj = new Auth("DB", $params, "loginFunction");
$authobj->username = 'xyz';

// 以下はテスト用に追加:テストのため強制的にログアウトさせてます
$authobj->start();
if ($authobj->getAuth()) {
    echo "ようこそ";
} else {
    echo "ログインしてください";
}
$authobj->logout();
id:cochoo

ありがとうございます。

まだ試していないのですが、これなら目的を実現できそうです。また、オリジナルauthではできないということがわかったことも収穫です!

2010/11/01 09:37:18
  • id:windofjuly
    うぃんど 2010/11/01 18:55:38
    >オリジナルauthではできない

    (解釈a)PEARのAuth.phpではなくて、独自にオリジナルのAuthスクリプトを作成されたということでしょうか?
    その場合はオリジナル作成なさったAuthスクリプトの中身を見てみないとこちらでは何とも判りません

    (解釈b)PEARのAuth.phpを改造してオリジナル化したように感じられたのでしょうか?
    PEARのAuth.phpは改造したりしてませんので安心してください
    テーブルの改造(インデックスの付け方が違う)がネックになっているということであれば、
    1つのusernameに複数のpasswordという組み合わせにする必要がなく、
    通常どおりに1つのusernameに1つのpasswordという組み合わせで運用する場合は、
    データベースもオリジナルのままで使えますよ
  • id:cochoo
    >>オリジナルauthではできない

    (解釈b)です。誤解させてしまって申し訳ありません。

    現時点では、通常どおりに1つのusernameに1つのpasswordという組み合わせでの運用を考えております。
    ご指摘とおり、コンストラクタのメンバusernameにそのまま値を入れれば、コンストラクタでその値を参照することができました。

    無事解決することができ、本当にありがとうございました!!

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません