2010-08-02 32 views
5

Tôi hiện đang sử dụng Trình cắm bộ điều khiển Zend để kiểm tra xác thực. Thông tin sau đây có thể quen thuộc:Xử lý lỗi Zend xác thực thông qua yêu cầu AJAX

class SF_Plugin_Member_Auth extends Zend_Controller_Plugin_Abstract { 

    public function preDispatch(Zend_Controller_Request_Abstract $request) { 

     if (!SF_Auth::getInstance('Member')->hasIdentity()) { 
      if ($request->getControllerName() !== 'auth' && $request->getControllerName() !== 'error') { 
       $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
       $r->gotoSimpleAndExit('login', 'auth', $request->getModuleName()); 
      } 
     } 
    } 
} 

Tôi không chắc chắn là cách tốt nhất để giải quyết yêu cầu AJAX chưa được xác thực. Vì vậy, nói ai đó cố gắng đăng nhập bằng cách sử dụng một biểu mẫu được gửi qua AJAX, Javascript nên biết rằng nó thực sự cần phải chuyển hướng người dùng đến trang đăng nhập như thế nào? Ý tưởng đầu tiên của tôi là kiểm tra xem yêu cầu có phải là một yêu cầu AJAX không, và sau đó lặp lại một đối tượng JSON với các chi tiết về nơi chuyển hướng người dùng đến - Javascript sau đó có thể tìm một thuộc tính cụ thể trong JSON được trả về và sử dụng URL đó làm URL "location.href" cho người dùng.

Có hai vấn đề với trên:

  1. Tôi không chắc chắn làm thế nào để ngăn chặn các yêu cầu từ được cử - tất cả tôi muốn làm là echo ra một chuỗi JSON đơn giản nếu nó là một yêu cầu AJAX.
  2. Nó không giống như một cách làm giống như Zend.

Có ai ngoài đó đã truy cập và giải quyết tình huống này không?

Cảm ơn rất nhiều,

James.

+0

thường, nếu bạn đang làm một yêu cầu AJAX, tôi giả sử bạn đang trở về một số phản ứng tiêu chuẩn (ig: {error: 0, nhắn: "ok", response: {}} - trong đó 'response' là đối tượng phản hồi thực sự từ yêu cầu và 'error' và 'message' là mã lỗi và thông điệp máy chủ)? –

Trả lời

1

Bạn có thể đặt giá trị json của mình trong đối tượng phản hồi và dừng yêu cầu một cách duyên dáng với trình chuyển hướng.

if (!SF_Auth::getInstance('Member')->hasIdentity()) { 
    if ($request->getControllerName() !== 'auth' && $request->getControllerName() !== 'error') { 
     if ($request->isXmlHttpRequest()) { 
      $json = Zend_Json::encode(array('auth' => false, 'url' => 'http://foo.bar/login')); 

      // Prepare response 
      $this->getResponse() 
       ->setHttpResponseCode(200) // Or maybe HTTP Status 401 Unauthorized 
       ->setBody($json) 
       ->sendResponse(); 

      // redirectAndExit() cleans up, sends the headers and stopts the script 
      Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')->redirectAndExit(); 
     } else {   
      $r = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); 
      $r->gotoSimpleAndExit('login', 'auth', $request->getModuleName()); 
     } 
    } 
} 

này ra một cái gì đó sẽ như thế này:

{"auth":false,"url":"http:\/\/foo.bar\/login"} 
Các vấn đề liên quan