2012-02-18 7 views
9

私はいくつかのサブアプリケーションを格納するアプリケーションに取り組んでいます。私は30分も使わないと自動ログアウトを実装したいと思います。私は、ログインしてAuthControllerを持っており、bootstrap.phpのを使用して、カスタム/ログインおよび/ログアウトルートだけでなく、このようになります。フロントコントローラプラグインにマッピングされたアクションログアウト:私はPHPとZendに新たなんだZend Framework非アクティブ後の自動ログアウト

class Plugin_SessionTrack extends Zend_Controller_Plugin_Abstract { 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 

     $employeeSession = new Zend_Session_Namespace('employeeSession'); 
     $employeeSession->setExpirationSeconds(10); 

    } 
} 

を10秒後にセッションに何が起こっているのですか?私はそれをテストのために低く設定しました。私がしたいのは、フロントコントローラープラグインによる最後のリクエストの時刻が30分以上前だった場合、セッションを破棄してユーザーをログアウトして/ loginにリダイレクトする場合です。

最後のリクエストの時刻を追跡していないことは明らかですが、ユーザーがこのpreDispatchメソッドを使用してリクエストを受け取るたびにsetExpirationSecondsがリフレッシュされることを望みました。

おそらくクッキーが必要ですか?私は実際にログアウトアクションを開始する必要はありません。それは、ユーザーが次回にリクエストをしたときに処理できます。セッションが最後の30分に何もしなかった場合、セッションが破棄されてログアウトされます。私が45分離れても私の画面は同じように見えますが、リンクをクリックするか、フォームを送信して提出すると、私は/ loginに私を送ります。私はJSカウントダウン警告の後にいくつかのタイプについて心配することができます。

編集:誰もがそれを見たい場合はここに私のブートストラップだ:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    /** 
    * Custom routes: 
    * 
    * /login 
    * /logout 
    */ 
    protected function _initRoutes() 
    { 

     $router = Zend_Controller_Front::getInstance()->getRouter(); 

     $loginRoute = new Zend_Controller_Router_Route('login', array('controller' => 'auth', 'action' => 'login')); 

     $logoutRoute = new Zend_Controller_Router_Route('logout', array('controller' => 'auth', 'action' => 'logout')); 

     $routesArray = array('login' => $loginRoute, 'logout' => $logoutRoute); 

     $router->addRoutes($routesArray); 

    } 

    protected function _initPlugins() 
    { 

     $frontController = Zend_Controller_Front::getInstance(); 
     $frontController->registerPlugin(new Plugin_SessionTrack()); 

    } 
} 
+0

まず、「非アクティブ」を定義します。私たちはPHPで見ることができるのはサーバー要求だけです。私は本当にこれを示唆していませんが、あなたはアクティビティを監視するためにjavascriptを使いたいときや、ログアウトメソッドを呼び出すときにタイムアウトすることがあります。ネームスペースの有効期限は、必要なものを実行していないようです。 – RockyFord

+0

非アクティブとは、ユーザーがPOSTしたことがないことを意味し、コントローラーでアクションが発生していないことを意味します。基本的には「キーボードから離れて」です。このサブアプリケーションはかなりデータ駆動型であるため、コントローラが動作していない場合(アクション)、アプリケーションを使用していないことが明らかです。 –

答えて

11

あなたがZend_Session::setExpirationSeconds(10)を呼び出すと、何も実際には、それ自体が10秒時間後にセッションに起こっていません。

この呼び出しによって、Zend_Sessionは、呼び出しが行われた時から有効期限のセッション名前空間をマークする内部値をtime() + $secondsに格納します。 Zend_Sessionが起動するたびに、セッションデータに有効期限が設定されているかどうかが確認され、有効であれば、有効期限またはホップ数が経過したかどうかがチェックされます。その場合、問題のセッションデータは初期化時に設定されていないため、アプリケーションからアクセスできなくなります。

すべての要求の冒頭でこの呼び出しを行う場合、各ページの読み込みで数秒間セッションの存続期間を延ばす必要があります。

php.iniのセッション設定が15分後にセッションを終了するように設定されている場合、60分後に期限切れになるように名前空間を設定しても、PHPのセッションの有効期間は15分になりません。 application.iniファイルでPHPのセッションディレクティブを調整することができます。

名前空間の有効期限を設定すると、セッション全体を破棄することなく、いくつかのセッションデータを自動的に削除できるという利点もあります。

あなたのアプリケーションの詳細はわかりませんが、プラグインを使ってログアウトしているかどうかを確認してログインページにリクエストを転送できます。ネームスペースを作成した後に有効なログインを確認することもできますが、現在のリクエストがログイン試行でないことを確認することもできます。または、プラグインで有効なログインの確認を延期し、後でコントローラレベルでACLを処理させることもできます。

Zend_Authを参照して、セッションでIDを保持することもできます。アイデンティティには、ログインしているかどうかを示す単純なブール値から、Zend_Acl_Role_Interfaceを実装している完全なユーザーオブジェクトまで、何でもかまいません。Zend Authも簡単に拡張されているので、インスタンスごとに異なる名前空間を使用することで、複数のZend_Authセッションを同時にアクティブにすることができ、カスタム認証クラスで異なるセッションの名前空間に異なる時間制限を設定できます。

あなたの質問に答えるのに役立つことを願っています。私が言ったことについて質問があれば、お気軽にコメントしてください。

EDIT:

私は、次のコードをテストし、それが成功した設定時間後に私にZend_Authアイデンティティを期限切れ。私は60秒でそれをテストし、ページを読み込むために60秒待って、私はもはや持っていたと身元と "ログアウト"されました。これをセッショントラックプラグインに追加することができます。

<?php 
$auth = Zend_Auth::getInstance(); 

if ($auth->hasIdentity()) { // user is logged in 
    // get an instance of Zend_Session_Namespace used by Zend_Auth 
    $authns = new Zend_Session_Namespace($auth->getStorage()->getNamespace()); 

    // set an expiration on the Zend_Auth namespace where identity is held 
    $authns->setExpirationSeconds(60 * 30); // expire auth storage after 30 min 
} 
+0

https://gist.github.com/8b2ae80e23543a34ca8aログイン操作があります。 Zend_Authアダプタを使用してActive Directory経由で認証しています。私は30分以上前に彼らがサイトで行った最後のアクションがあった場合、ユーザーのログアウトを強制することを除いて、すべて機能しています。 –

+0

あなたのアプリケーションの後半に、ユーザーがログインしているかどうかを確認するにはどうすればよいですか?認証のIDがヌルでないことを確認するだけですか? Zend_AuthのIDを期限切れにする方法を示す私の更新された答えを見てください。あなたが探していたことを願っています。 – drew010

+0

ええ、後で私は彼らがログインしているかどうかを知る必要がある場合、私はちょうどgetIdentity()を取得し、それがどのように見えるかを参照してください。だから、$ authnsを30分で期限切れにすると、以前は良いgetIdentity()がnullになっていますか? –