PEAR::Authで認証システムを開発しております。

実現したい機能は次の通りです。
①session1.phpとsession2.phpをSIDを維持して行き来可
②どこでもリロード可
③一定時間入力がない場合はタイムアウトし、再度ログインを要求
問題は、②と③が同時に実現できないことです。
次の処理は、①と②だけが実現できているものです。
●session1.php
<?php
if (isset($_GET['access']) {
session_start();
if (isset($_SESSION['count']) {
// 2回目のアクセス
} else {
// 不正アクセス
exit();
}
} else {
// Auth認証処理
if (認証成功) {
if (isset($_GET['access']) {
$_SESSION['count'] = 1;
}
} else {
// 認証失敗
exit();
}
?>

<HTML<BODY>
<A HREF="session2.php">sessio2へ</A>
</BODY></HTML>

●session2.php
<?php
session_start();
if (!isset($_SESSION['count'])) {
// 不正アクセス
exit();
} else {
echo '<a href="session1.php?access=1">session1へ</a>';
}
?>

②と③を同時に実現する方法でみなさんがどのように工夫されているのか、ご助言をいただければ幸いです。
よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2009/10/09 13:38:53
  • 終了:2009/10/15 13:54:08

ベストアンサー

id:KeyKey No.2

KeyKey回答回数29ベストアンサー獲得回数42009/10/09 20:33:53

ポイント47pt

PEAR::Authをどこに使っているのかわかりませんが、

コメントを閉じているため私なりの解釈で作成してみました。

まず「define.php」これは定数などを設定するファイルです。

<?php
/* --- 認証有効期限(1日) --- */
define("EXPIRE_TIME", 60 * 60 * 24 * 30);
/* --- アイドル時間(1時間) --- */
define("IDLE_TIME", 60 * 60 * 1);

/* --- SID:hatena=xxx --- */
session_name("hatena");
session_start();
?>

ファイル数が多くなるのが嫌な場合は次の「myauth.php」にでも組み込んでください。

「myauth.php」はPEAR::Authを使い認証処理を行います。

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

function loginFunction($username = null, $status = null, &$auth = null)
{
    echo '<form method="post" action="">';
    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_obj = new Auth("DB", $options, "loginFunction");

$a_obj->setExpire(EXPIRE_TIME, false);
$a_obj->setIdle(IDLE_TIME, false);

/* --- 認証スタート(未認証の場合「loginFunction」の認証フォームが表示) --- */
$a_obj->start();

/* --- 未認証の場合認証フォームが表示されるのでストップ --- */
if (!$a_obj->checkAuth()) {
    exit();
}
?>

これはほとんどPEAR::Authのチュートリアルと同じですのでそちらを参照してください。

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

「session1.php」

<?php
require_once "define.php";
require_once "myauth.php";

if (isset($_SESSION['count'])) {
    // 2回目のアクセス
} else {
    $_SESSION['count'] = 1;
}
?>
<HTML>
<BODY>
<A HREF="session2.php">sessio2へ</A>
</BODY>
</HTML>

設定ファイルと認証処理を呼び出します。

未認証の場合認証フォームが出たところでストップし、

認証OKの場合3行目以下が実行されます。

「session2.php」

<?php
require_once "define.php";
require_once "myauth.php";

if (isset($_SESSION['count'])) {
    // 2回目のアクセス
} else {
    $_SESSION['count'] = 1;
}
?>
<HTML>
<BODY>
<A HREF="session1.php">sessio1へ</A>
</BODY>
</HTML>

「session1.php」とほぼ同じです。

「session1.php」から「session2.php」に移動するときに(逆でも)1時間以上経っていると

認証が切れ「myauth.php」からフォームが表示されます。

どちらも同じ名前のセッションを使用しているので

COOKIEが有効ならリロードも相互のアクセスでもログイン状態とセッション情報を引き継げます。

COOKIE無効の場合はリンクにSIDでもくっ付けてください。

id:cochoo

ご親切にご回答いただきありがとうございます。

ご教授いただいた上記の方法で希望の動作を行うことができました。

Authはログイン時の1回だけでそのあと呼び出すのを行っていなかったこと、session_start()の呼び出し位置にあ誤りがあったことが問題でした。

わかりやすいプログラムでご指摘頂き、大変勉強になりました。

本当にありがとうございました!!

PEAR::Authに関しては、プログラム中の "// Auth認証処理" の箇所にmyauth.phpと同じ処理が記述してありました。

割愛してあったことを記述しておらず、ご迷惑をおかけして申し訳ありませんでした。

2009/10/10 00:12:56

その他の回答(1件)

id:goog20090901 No.1

goog20090901回答回数637ベストアンサー獲得回数172009/10/09 16:50:29

ポイント23pt

session2.php

session_start();

が必要ないというか、ここに入れるべきじゃないと思われる。

http://q.hatena.ne.jp/answer

id:cochoo

ご回答ありがとうございます。

おっしゃるとおり、リンク先でsession_start()は必要ないし、この箇所に入れるべきではないと思います。

本来、Authを使えば、session_start()を使わずともSIDを持ちまわれるはずなのですが、リンク先でsession_start()を使わないと、$_SESSIONが読み出せませんでした。

質問の仕方が悪く申し訳ありません。

もう少し、検討してみます。本当にありがとうございました。

2009/10/09 23:38:13
id:KeyKey No.2

KeyKey回答回数29ベストアンサー獲得回数42009/10/09 20:33:53ここでベストアンサー

ポイント47pt

PEAR::Authをどこに使っているのかわかりませんが、

コメントを閉じているため私なりの解釈で作成してみました。

まず「define.php」これは定数などを設定するファイルです。

<?php
/* --- 認証有効期限(1日) --- */
define("EXPIRE_TIME", 60 * 60 * 24 * 30);
/* --- アイドル時間(1時間) --- */
define("IDLE_TIME", 60 * 60 * 1);

/* --- SID:hatena=xxx --- */
session_name("hatena");
session_start();
?>

ファイル数が多くなるのが嫌な場合は次の「myauth.php」にでも組み込んでください。

「myauth.php」はPEAR::Authを使い認証処理を行います。

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

function loginFunction($username = null, $status = null, &$auth = null)
{
    echo '<form method="post" action="">';
    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_obj = new Auth("DB", $options, "loginFunction");

$a_obj->setExpire(EXPIRE_TIME, false);
$a_obj->setIdle(IDLE_TIME, false);

/* --- 認証スタート(未認証の場合「loginFunction」の認証フォームが表示) --- */
$a_obj->start();

/* --- 未認証の場合認証フォームが表示されるのでストップ --- */
if (!$a_obj->checkAuth()) {
    exit();
}
?>

これはほとんどPEAR::Authのチュートリアルと同じですのでそちらを参照してください。

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

「session1.php」

<?php
require_once "define.php";
require_once "myauth.php";

if (isset($_SESSION['count'])) {
    // 2回目のアクセス
} else {
    $_SESSION['count'] = 1;
}
?>
<HTML>
<BODY>
<A HREF="session2.php">sessio2へ</A>
</BODY>
</HTML>

設定ファイルと認証処理を呼び出します。

未認証の場合認証フォームが出たところでストップし、

認証OKの場合3行目以下が実行されます。

「session2.php」

<?php
require_once "define.php";
require_once "myauth.php";

if (isset($_SESSION['count'])) {
    // 2回目のアクセス
} else {
    $_SESSION['count'] = 1;
}
?>
<HTML>
<BODY>
<A HREF="session1.php">sessio1へ</A>
</BODY>
</HTML>

「session1.php」とほぼ同じです。

「session1.php」から「session2.php」に移動するときに(逆でも)1時間以上経っていると

認証が切れ「myauth.php」からフォームが表示されます。

どちらも同じ名前のセッションを使用しているので

COOKIEが有効ならリロードも相互のアクセスでもログイン状態とセッション情報を引き継げます。

COOKIE無効の場合はリンクにSIDでもくっ付けてください。

id:cochoo

ご親切にご回答いただきありがとうございます。

ご教授いただいた上記の方法で希望の動作を行うことができました。

Authはログイン時の1回だけでそのあと呼び出すのを行っていなかったこと、session_start()の呼び出し位置にあ誤りがあったことが問題でした。

わかりやすいプログラムでご指摘頂き、大変勉強になりました。

本当にありがとうございました!!

PEAR::Authに関しては、プログラム中の "// Auth認証処理" の箇所にmyauth.phpと同じ処理が記述してありました。

割愛してあったことを記述しておらず、ご迷惑をおかけして申し訳ありませんでした。

2009/10/10 00:12:56

コメントはまだありません

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

トラックバック

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません