Zend_Authで認証したらセッションタイムアウトが設定時間どおりで容赦なく切れちゃう

| | コメント(2) | トラックバック(0)
えっと何がいいたいのかというとログインセッションの持続時間は、「最後のアクセスから1時間」といった感じに設定したいじゃないですか。それがZend_Auth使って普通にやると、いくら絶え間なくアクセスしてても指定時間がくるとタイムアウトしちゃう。
「最後のアクセスから」という風にするためにこんな感じにしてみた。



 アクションクラス

class MemberController extends Zend_Controller_Action {

    public function loginAction(){
        require_once 'Zend/Auth.php';
        $auth = Zend_Auth::getInstance();
        require_once dirname(__FILE__).'/../models/session/ExtendedStorage.php';
        $auth->setStorage(new ExtendedStorage(10, 'login'));

        ~中略~

        $result = $auth->authenticate($adapter);

        if($result->isValid()){           
            $this->_redirect('/top');
        }else{
            $this->view->assign('postData',array_merge(
            array(
                'loginId' => '',
                'password' => '',
                'authError' => 'ユーザーID・パスワードに誤りがあるか登録されていません。'
                ),$request->getPost()));
        }

このクラスで認証してます。セッションの有効期限は10秒。
ExtendedStrageはセッションタイムアウト値を設定できるようにだけした単純なクラス。
ネーミングがよくないね。

class ExtendedStorage extends Zend_Auth_Storage_Session {
    public function __construct($expirationSeconds = 5, $namespace = self::NAMESPACE_DEFAULT, $member = self::MEMBER_DEFAULT){
        parent::__construct();
        //セッションタイムアウト値設定
        $this->_session->setExpirationSeconds($expirationSeconds);
    }
}


セッションの確認はプラグインを使って、リクエストごとに行ってます。

class AuthPlugin extends Zend_Controller_Plugin_Abstract {
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request){
        $auth = Zend_Auth::getInstance();
        if(!$auth->hasIdentity()){
            if($request->getModuleName() != 'default' ||
            $request->getControllerName() != 'member' ||
            $request->getActionName() != 'login'){
                $sess = new Zend_Session_Namespace('login');
                $sess->currentModule = $request->getModuleName();
                $sess->currentController = $request->getControllerName();
                $sess->currentAction = $request->getActionName();
                $sess->hoge = 'hoge';

                $request->setModuleName('default');
                $request->setControllerName('index');
                $request->setActionName('index');
            }
        }else{
            require_once dirname(__FILE__).'/../../models/session/ExtendedStorage.php';
            $auth->setStorage(new ExtendedStorage(10, 'login'));
            $sess = new Zend_Session_Namespace('login');
            echo $sess->hoge;

        }
    }
}

hasIdentiry()でログイン状態が有効なことが確認できたら再度、セッションを生成してストレージに格納しておく。
            $auth->setStorage(new ExtendedStorage(10, 'login'));
これでリロードするたびにセッションタイムアウト時間は10秒延びる。リロード連発しながらこの一行のあるなし変えてみてセッションが切れるかどうかが確認できるはず。
ついでにログイン処理時にテスト用に格納しておいたhogeも出力できることを確認できた。

これでいいのかな。
おかしい点、不明点などあったらコメント欄にヨロシク。





トラックバック(0)

このブログ記事を参照しているブログ一覧: Zend_Authで認証したらセッションタイムアウトが設定時間どおりで容赦なく切れちゃう

このブログ記事に対するトラックバックURL: http://hirop0164.s326.xrea.com/mt/mt-tb.cgi/213

コメント(2)

こんばんは。プラグインで実装させたく探していたところたどり着きました。
認証状態でない場合の処理は省略しましたがおかげ様で何とか実装できました^^

質問があるのですが各アクションの各メソッドで権限をセットしそれを参照し
会員限定のページの場合にはログインしていなければログインページに飛ばすなどできないでしょうか?

具体的には各アクションの各メソッドで以下の様に権限名をセットします。
・誰でも閲覧可能『guest』
・会員限定の閲覧『user』

これをプラグインで判断し会員限定ページにアクセスの場合に限り権限が『guest』で
あればログインページにリダイレクトさせるイメージなのですが・・・

>りょーさん
はじめまして、コメントありがとうございます。
お役に立てたなら何よりです。

ご質問いただいた件について、僕のブログの文章を見ていただければお分かりかと思いますが、僕は頭がよくありません。
なので、見当はずれのことを言うかも知れませんが、あらかじめご了承ください。

さて、りょーさんのやりたいことはできないような気がします。なぜならプラグインはアクションの名前も実装も知らないからです。

僕も似たようなことがやりたかったことがありましたが、そのときはActionクラスの親クラス(誰でも閲覧できるページ用と会員専用ページ用)を作ってそこのinit()とかで判断させるというやり方をした記憶がうっすらあります。

「各アクションの各メソッドで」とありますが、メソッドレベルでそれをするのはきついので、どーしても、という理由がなければクラスレベルで分けられていた方が色々幸せになれるように思います。

コメントする


画像の中に見える文字を入力してください。

ブックマーク

はてなブックマークに追加 Yahoo!ブックマークに登録 del.icio.us に登録 ライブドアクリップに追加 Google Bookmarks に追加

Ajax: 2009年5月: 月別アーカイブ

このブログ記事について

このページは、ぴろしが2008年10月25日 22:31に書いたブログ記事です。

ひとつ前のブログ記事は「require_onceの謎」です。

次のブログ記事は「PHPで機種依存文字をチェック」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。