人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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");


●質問者: cochoo
●カテゴリ:インターネット ウェブ制作
✍キーワード:DB DSN localhost password Pear
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● hgijgbnfhfg
●0ポイント (はてなにより削除しました) ◎質問者からの返答

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


2 ● うぃんど
●100ポイント ベストアンサー

【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ではできないということがわかったことも収穫です!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ