2012-02-18 4 views
9

Pracuję na aplikacji, która mieści kilka aplikacji sub i chciałbym wdrożyć automatycznego wylogowania po 30 minutach bezczynności. Mam AuthController z logowania i wylogowania działania odwzorowanych obyczajowa/login i/tras wylogowania używając bootstrap.php jak również przednim sterownika plugin, który wygląda tak:Zend Framework automatyczne wylogowanie po bezczynności

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); 

    } 
} 

Jestem nowym PHP i Zend , co dokładnie dzieje się z sesją po 10 sekundach? Mam go ustawionego na niskim poziomie do testowania. To, co chciałbym mieć, to to, że czas ostatniej prośby za pośrednictwem wtyczki kontrolera frontowego był dłuższy niż 30 minut temu, zniszczyć sesję i zalogować użytkownika i przekierować go do/login.

Widzę oczywiście, że nie śledzę czasu ostatniego żądania, ale miałem nadzieję, że setExpirationSeconds zostanie odświeżony za każdym razem, gdy użytkownik otrzyma żądanie przez tę metodę preDispatch.

Może potrzeby cookies wykorzystywane? Nie muszę faktycznie inicjować akcji wylogowania, może być ona obsługiwana następnym razem, gdy użytkownik wyśle ​​żądanie, jeśli nic nie zrobiło w ciągu ostatniego pół godziny sesja została zniszczona i wylogowano, co oznacza jeśli odejdę na 45 minut, mój ekran będzie wyglądał tak samo, ale jeśli kliknę link lub spróbuję przesłać formularz, który wysłałem, wysyła mnie do/login. Od pewnego czasu mogę się martwić o ostrzeżenie o odliczaniu JS.

Edycja: Oto mój bootstrap jeśli ktoś chce je zobaczyć:

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

Najpierw zdefiniuj "brak aktywności". Wszystko, co możemy zobaczyć w php, to żądania serwera. Naprawdę nienawidzę tego sugerować, ale możesz chcieć użyć javascript do monitorowania aktywności, a kiedy "przekroczy limit czasu", wyślij metodę wylogowania. Przestój przestrzeni nazw wydaje się nie robić tego, czego potrzebujesz. – RockyFord

+0

Bezczynność oznacza, że ​​użytkownik nie wysłał formularza POST, nie wykonał czynności w kontrolerze. Zasadniczo są "Z dala od klawiatury". Aplikacje podrzędne tego typu są dość oparte na danych, więc powinno być oczywiste, że nie używają aplikacji, jeśli coś nie uderza kontrolerów (działań). –

Odpowiedz

11

Po wywołaniu Zend_Session::setExpirationSeconds(10), nic się rzeczywiście dzieje na sesji po 10 sekundach czasu per se.

To wywołanie powoduje, że Zend_Session przechowuje wewnętrzną wartość oznaczającą przestrzeń nazw sesji dla ważności na time() + $seconds od czasu wywołania. Za każdym razem, gdy rozpoczyna się Zend_Session, sprawdza, czy dane sesji są oznaczone jako wygasłe, a jeśli tak, to sprawdza, czy upłynął czas wygaśnięcia lub liczba przeskoków. W takim przypadku dane sesji, o których mowa, nie są ustawiane podczas inicjowania i dlatego nie są już dostępne dla aplikacji.

Jeśli się to wezwanie na początku każdego żądania, należy kontynuować, aby przedłużyć żywotność sesji przez że wiele sekund na każdej stronie obciążenia.

Należy pamiętać, że jeśli ustawienia sesji w php.ini ustawią się na wygaśnięcie sesji po 15 minutach, ustawienie przestrzeni nazw po upływie 60 minut nie zastąpi czasu życia sesji PHP wynoszącego 15 minut. Możesz wprowadzić takie poprawki do dyrektyw sesji PHP w pliku application.ini.

Ustawianie ważności na nazw ma również tę zaletę, automatycznie usunąć niektóre dane sesji bez konieczności zniszczyć całą sesję.

Nie znam specyfiki danej aplikacji, ale można użyć wtyczki, aby sprawdzić i zobaczyć, czy są one wylogowanie i przekazuje żądanie do strony logowania. Po utworzeniu przestrzeni nazw można sprawdzić poprawne logowanie, ale należy się także upewnić, że bieżące żądanie nie było próbą zalogowania. Lub po prostu odroczyć sprawdzanie poprawnego logowania w wtyczce i pozwolić na obsługę ACL, która później na poziomie kontrolera.

Można również zajrzeć do Zend_Auth, które można wykorzystać do utrwalania tożsamości w sesji. Tożsamość może być dowolną wartością od prostej wartości boolowskiej wskazującej, czy są one zalogowane, do pełnego obiektu użytkownika, który implementuje Zend_Acl_Role_Interface.Zend Auth można także łatwo rozszerzyć, dzięki czemu możesz mieć wiele sesji Zend_Auth aktywnych w tym samym czasie, używając różnych przestrzeni nazw dla każdej instancji, i może mieć niestandardową klasę auth ustawioną różne limity czasu dla różnych przestrzeni nazw sesji.

Mam nadzieję, że pomoże to w odpowiedzi na twoje pytanie, nie wahaj się komentować, jeśli masz pytania na temat tego, co powiedziałem.

EDIT:

Testowałem poniższy kod i to z powodzeniem upłynął moją tożsamość Zend_Auth po ustalonym czasie. Przetestowałem to na niskim poziomie z 60 sekund i po odczekaniu 60 sekund na załadowanie strony, nie miałem już tożsamości i byłem "wylogowany". Możesz dodać to do wtyczki do sesji sesji.

<?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 Istnieje moja akcja logowania. Używam adaptera Zend_Auth do uwierzytelniania ich za pośrednictwem usługi Active Directory. Mam wszystko działa, z wyjątkiem możliwości wymuszenia wylogowania się z ich użytkownika, jeśli ostatnia akcja, jaką wykonali na stronie, miała miejsce> 30 minut temu. –

+0

Później w swojej aplikacji, co zrobić, aby sprawdzić, czy użytkownik jest zalogowany? Czy sprawdzasz, czy tożsamość auth nie jest pusta? Zobacz moją zaktualizowaną odpowiedź, która pokazuje, jak wygasić tożsamość Zend_Auth. Mam nadzieję, że tego właśnie szukałeś. – drew010

+0

Tak, później, jeśli chcę się przekonać, czy są zalogowani, po prostu pobierz getIdentity() i zobaczę, jak to wygląda. Więc kiedy ustawienie $ authns na wygaśnie za 30 minut spowoduje to, że wcześniej dobry getIdentity() zmieni się na null? –