以下の一般的な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");
【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();
【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();
ありがとうございます。
まだ試していないのですが、これなら目的を実現できそうです。また、オリジナルauthではできないということがわかったことも収穫です!
ありがとうございます。
まだ試していないのですが、これなら目的を実現できそうです。また、オリジナルauthではできないということがわかったことも収穫です!