2011-12-01 51 views

回答

1

我們使用處理我們身份驗證的Controller plugin(在boot.ini配置文件中引導)。它在preDispatch()階段檢查請求的控制器/操作,並匹配ACL對象(可以從DB,配置文件,XML等中取出)。如果用戶沒有權限訪問目標控制器/操作,則會將消息存儲在會話中,並且用戶將被重定向到另一個頁面,以顯示訪問禁止消息。

如果用戶需要進行身份驗證才能訪問目標控制器/操作,則通過修改請求對象將用戶重定向到登錄操作。

使用此插件不需要檢查每個控制器中的用戶認證/ ACL,因此所有「Access」代碼都將包含在一個文件「Access Plugin」中。

爲了檢查用戶身份,我們主要使用「Zend_Auth :: getInstance() - > hasIdenity()」的相同方法,但這只是顯示用戶是否已通過身份驗證。 Zend_Auth的'''getIdentity()''方法返回當前用戶標識,但同樣只是標識而不是更多。但是,如果您需要用戶的更多信息,則可以將用戶信息存儲在會話中。

我們將用戶實現爲數據模型,因此每個用戶都被定義爲一個對象。一個用戶在登錄操作驗證後,我們創建相應的用戶對象並將其存儲在用戶會話是這樣的:

// This could be a sample code in AuthController/processloginAction() 
// suppose $username is validated before and stores the username 
$user = new Default_Model_User($username); 
// now $user is our user object, suppose $log is a Zend_Log instance 
$log->info("user id '{$user->getId()}' username: '{$user->getUsername()}' logged in"); 
$sess = Zend_Session_Namespace('auth'); 
$sess->user = $user; 

從現在之一,「身份驗證」的會話命名空間的$用戶屬性是包含所有您需要的信息的用戶對象,而不僅僅是身份。每當你想檢查用戶登錄(使用Zend_Auth的旁邊),你可以檢查用戶會話該值的可用性:

$sess = Zend_Session_Namespace('auth'); 
if (!isset($sess->user) || !$sess->user) { 
    // user is not logged in, redirect to login page 
} 
$user = $sess->user; 
/*@var $user Default_Model_User*/ 
$email = $user->getEmail(); 

現在我們檢查認證,並有機會獲得用戶信息(電子郵件,電話等)。

0

完全可以這樣做,但爲了避免重複該代碼,您可以將所有控制器從Zend_Controller_Action的子類A中擴展出來。那麼這個類中聲明的方法

​​

現在,在您的控制器,它是A的子類,你可以簡單地做$this->hasIdentity();代替

1

我使用類似於在http://www.hermanradtke.com/blog/more-reliable-authentication-in-zend-framework/在自己的博客赫爾曼瑞克描述的方法的方法。基本上,創建一個控制器插件作爲法扎德提到:

class My_Authentication extends Zend_Controller_Plugin_Abstract 
{ 

    private $_whitelist; 

    public function __construct() 
    { 
     $this->_whitelist = array(
      'index/login' 
     ); 
    } 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $controller = strtolower($request->getControllerName()); 
     $action = strtolower($request->getActionName()); 
     $route = $controller . '/' . $action; 

     if (in_array($route, $this->_whitelist)) { 
      return; 
     } 

     $auth = Zend_Auth::getInstance(); 
     if ($auth->hasIdentity()) { 
      return; 
     } 

     self::setDispatched(false); 
     // handle unauthorized request... 
    } 
} 

,然後註冊該插件在你的引導:

public function run() { 
    $front->registerPlugin(new My_Authentication()); 
} 

我一般採取這種方法有點遠和Zend_Acl中融入系統中。要做到這一點我會在下面定義的插件:

類My_Acl_Authentication擴展Zend_Controller_Plugin_Abstract {

private $_acl; 

    public function __construct($acl) 
    { 
     $this->_acl = $acl 
    } 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     $controller = strtolower($request->getControllerName()); 
     $action = strtolower($request->getActionName()); 
     $route = $controller . '/' . $action; 

     if (in_array($route, $this->_whitelist)) { 
      return; 
     } 

     $auth = Zend_Auth::getInstance(); 
     $role = 'anonymous'; 
     if ($auth->hasIdentity()) { 
      $role = $auth->getStorage->read()->role; 
     } 

     if ($this->_acl->isAllowed($role, $route)) { 
      return; 
     } 

     self::setDispatched(false); 
     // handle unauthorized request... 
    } 
} 

如果你走這條路線有一些需要做更多的工作,特別是你要設置的ACL,然後您還必須將用戶的角色存儲在auth存儲中。

相關問題