2012-02-18 25 views
9

Tôi đang làm việc trên một ứng dụng chứa nhiều ứng dụng phụ và tôi muốn triển khai đăng xuất tự động sau 30 phút không hoạt động. Tôi có một AuthController với đăng nhập và đăng xuất hành động ánh xạ tới tùy chỉnh/đăng nhập và các tuyến đường/logout sử dụng Bootstrap.php cũng như một bộ điều khiển cắm phía trước trông như thế này:Tự động đăng xuất khung công tác Zend sau khi không hoạt động

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

    } 
} 

Tôi mới đến PHP và Zend , chính xác những gì đang xảy ra với phiên sau 10 giây? Tôi có nó thấp để thử nghiệm. Những gì tôi muốn có xảy ra là nếu thời gian của yêu cầu cuối cùng thông qua các plugin điều khiển phía trước đã được lớn hơn 30 phút trước, phá hủy các phiên và đăng nhập người dùng ra và chuyển hướng chúng đến/đăng nhập.

Tôi có thể thấy rõ ràng rằng tôi không theo dõi thời gian của yêu cầu cuối cùng nhưng hy vọng của tôi là setExpirationSeconds sẽ được làm mới mỗi lần người dùng có yêu cầu đến thông qua phương thức preDispatch này.

Có thể cần sử dụng cookie? Tôi không cần thực sự bắt đầu hành động đăng xuất, nó chỉ có thể được xử lý vào lần tiếp theo người dùng đưa ra yêu cầu, nếu họ không làm gì trong nửa giờ cuối, phiên bị hủy và họ đã đăng xuất, có nghĩa là nếu tôi đi bộ trong 45 phút, màn hình của tôi vẫn trông giống nhau nhưng nếu tôi nhấp vào liên kết hoặc thử và gửi biểu mẫu tôi đã gửi, tôi sẽ gửi cho tôi/đăng nhập. Tôi có thể lo lắng về một số loại cảnh báo đếm ngược JS sau này.

Edit: Đây là bootstrap của tôi nếu có ai muốn nhìn thấy nó:

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

Đầu tiên xác định 'không hoạt động'. Tất cả những gì chúng ta có thể thấy trong php là yêu cầu máy chủ. Tôi thực sự ghét đề nghị này, nhưng bạn có thể muốn sử dụng javascript để theo dõi hoạt động và khi nó 'lần ra' gọi phương thức đăng xuất. Hết hạn không gian tên dường như không làm những gì bạn cần. – RockyFord

+0

Không hoạt động có nghĩa là người dùng đã không POST một biểu mẫu, họ đã không được nhấn hành động trong bộ điều khiển. Về cơ bản chúng "Away from Keyboard". Các ứng dụng phụ nhà này là khá dữ liệu điều khiển vì vậy nó nên được rõ ràng rằng họ không sử dụng các ứng dụng nếu mọi thứ không đánh các bộ điều khiển (hành động). –

Trả lời

11

Khi bạn gọi Zend_Session::setExpirationSeconds(10), không có gì là thực sự xảy ra với phiên giao dịch sau 10 giây thời gian cho mỗi gia nhập.

Cuộc gọi này làm cho Zend_Session lưu trữ giá trị nội bộ đánh dấu không gian tên phiên đó hết hạn tại time() + $seconds từ thời điểm cuộc gọi được thực hiện. Mỗi lần bắt đầu Zend_Session, nó sẽ kiểm tra xem liệu dữ liệu phiên nào có được đánh dấu là hết hạn hay không và nếu có thì hãy kiểm tra xem liệu thời gian hết hạn hay số lượng hop đã trôi qua chưa. Nếu đúng như vậy, thì dữ liệu phiên được đề cập không được đặt lúc khởi tạo và do đó không thể truy cập được bằng ứng dụng của bạn nữa.

Nếu bạn thực hiện cuộc gọi này vào đầu mỗi yêu cầu, nó sẽ tiếp tục kéo dài tuổi thọ của phiên bằng nhiều giây trên mỗi lần tải trang.

Hãy nhớ rằng nếu cài đặt phiên trong php.ini được đặt để hết hạn phiên sau 15 phút, hãy đặt không gian tên hết hạn sau 60 phút sẽ không ghi đè tuổi thọ phiên của PHP trong 15 phút. Bạn có thể thực hiện các điều chỉnh đó với chỉ thị phiên của PHP trong tệp application.ini của bạn.

Đặt thời gian hết hạn trên vùng tên cũng có lợi thế là tự động xóa một số dữ liệu phiên mà không phải hủy toàn bộ phiên.

Tôi không biết chi tiết về ứng dụng của bạn, nhưng bạn có thể sử dụng plugin để kiểm tra xem họ có đăng xuất hay không và chuyển tiếp yêu cầu đến trang đăng nhập của bạn. Bạn có thể kiểm tra thông tin đăng nhập hợp lệ sau khi tạo không gian tên, nhưng bạn cũng muốn đảm bảo rằng yêu cầu hiện tại không phải là một lần đăng nhập. Hoặc bạn chỉ có thể trì hoãn việc kiểm tra đăng nhập hợp lệ trong plugin và để ACL của bạn xử lý sau này ở cấp bộ điều khiển.

Bạn cũng có thể muốn xem xét Zend_Auth mà bạn có thể sử dụng để duy trì nhận dạng trong phiên. Danh tính có thể là bất kỳ thứ gì từ một giá trị boolean đơn giản cho biết liệu chúng có được đăng nhập hay không, đến một đối tượng người dùng được thổi đầy đủ thực hiện Zend_Acl_Role_Interface.Zend Auth cũng dễ dàng mở rộng để bạn có thể có nhiều phiên Zend_Auth hoạt động cùng một lúc bằng cách sử dụng các không gian tên khác nhau cho mỗi cá thể và có thể có lớp auth tùy chỉnh của bạn đặt giới hạn thời gian khác nhau trên các không gian tên phiên khác nhau.

Tôi hy vọng rằng sẽ giúp trả lời câu hỏi của bạn, hãy bình luận nếu bạn có câu hỏi về những gì tôi đã nói.

EDIT:

Tôi đã thử nghiệm đoạn mã sau và nó đã hết hạn thành công bản sắc Zend_Auth tôi sau thời gian quy định. Tôi đã thử nghiệm nó thấp với 60 giây và sau khi chờ đợi 60 giây để tải trang, tôi không còn có và nhận dạng và đã được "đăng xuất". Bạn có thể thêm phần này vào plugin theo dõi phiên của mình.

<?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 Có hành động đăng nhập của tôi. Tôi đang sử dụng một adapter Zend_Auth để xác thực chúng thông qua Active Directory. Tôi đã có tất cả hoạt động ngoại trừ việc có thể buộc đăng xuất người dùng của họ nếu hành động cuối cùng họ thực hiện trên trang web là> 30 phút trước. –

+0

Sau này trong ứng dụng của bạn, bạn sẽ làm gì để kiểm tra xem người dùng đã đăng nhập chưa? Bạn chỉ cần kiểm tra để thấy rằng danh tính của auth không phải là null? Xem câu trả lời cập nhật của tôi cho thấy cách hết hạn danh tính Zend_Auth. Hy vọng đó là những gì bạn đang tìm kiếm. – drew010

+0

Vâng sau đó nếu tôi cần phải xem nếu họ đang đăng nhập tôi chỉ cần lấy getIdentity() và xem nó trông như thế nào. Vì vậy, khi thiết lập $ authns hết hạn sau 30 phút, điều này có làm cho getIdentity() trở thành tốt trước đó không? –

Các vấn đề liên quan