実現したい機能は次の通りです。
①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>';
}
?>
②と③を同時に実現する方法でみなさんがどのように工夫されているのか、ご助言をいただければ幸いです。
よろしくお願いいたします。
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でもくっ付けてください。
ご回答ありがとうございます。
おっしゃるとおり、リンク先でsession_start()は必要ないし、この箇所に入れるべきではないと思います。
本来、Authを使えば、session_start()を使わずともSIDを持ちまわれるはずなのですが、リンク先でsession_start()を使わないと、$_SESSIONが読み出せませんでした。
質問の仕方が悪く申し訳ありません。
もう少し、検討してみます。本当にありがとうございました。
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でもくっ付けてください。
ご親切にご回答いただきありがとうございます。
ご教授いただいた上記の方法で希望の動作を行うことができました。
Authはログイン時の1回だけでそのあと呼び出すのを行っていなかったこと、session_start()の呼び出し位置にあ誤りがあったことが問題でした。
わかりやすいプログラムでご指摘頂き、大変勉強になりました。
本当にありがとうございました!!
PEAR::Authに関しては、プログラム中の "// Auth認証処理" の箇所にmyauth.phpと同じ処理が記述してありました。
割愛してあったことを記述しておらず、ご迷惑をおかけして申し訳ありませんでした。
ご親切にご回答いただきありがとうございます。
ご教授いただいた上記の方法で希望の動作を行うことができました。
Authはログイン時の1回だけでそのあと呼び出すのを行っていなかったこと、session_start()の呼び出し位置にあ誤りがあったことが問題でした。
わかりやすいプログラムでご指摘頂き、大変勉強になりました。
本当にありがとうございました!!
PEAR::Authに関しては、プログラム中の "// Auth認証処理" の箇所にmyauth.phpと同じ処理が記述してありました。
割愛してあったことを記述しておらず、ご迷惑をおかけして申し訳ありませんでした。