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

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>';
}
?>

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

●質問者: cochoo
●カテゴリ:ウェブ制作
✍キーワード:access ECHO EXIT Pear PHP
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● goog20090901
●23ポイント

session2.php

session_start();

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

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

◎質問者からの返答

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

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

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

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

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


2 ● KeyKey
●47ポイント ベストアンサー

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と同じ処理が記述してありました。

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

関連質問


●質問をもっと探す●



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