目前,我使用Zend_Auth::getInstance()->hasIdentity()
來檢查我的用戶是否在每個需要登錄的控制器中登錄。我覺得我很可怕地練習Zend,所以我想問更多有經驗的人,知道這是否是正確的方法?如果沒有,請告訴我什麼是?在Zend中,有沒有更好的方法來檢查用戶是否有Identity()?
回答
我們使用處理我們身份驗證的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();
現在我們檢查認證,並有機會獲得用戶信息(電子郵件,電話等)。
完全可以這樣做,但爲了避免重複該代碼,您可以將所有控制器從Zend_Controller_Action的子類A中擴展出來。那麼這個類中聲明的方法
現在,在您的控制器,它是A的子類,你可以簡單地做$this->hasIdentity();
代替
我使用類似於在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存儲中。
- 1. 有沒有好的方法來檢查UIViewController是否出現?
- 2. 有沒有更好的方法來檢查AJAX請求的值是否有效?
- 3. 有沒有更好的方法來檢查表單是否被加載?
- 4. 有沒有更好的方法來寫這個?檢查場景
- 5. JPA:更好的方法來檢查實體是否有關聯
- 6. 更好的方法來檢查是否有零?
- 7. 有沒有更好的方法來檢查列表中的所有條目是否在另一個列表中?
- 8. 骨幹 - 檢查記錄是否存在 - 有沒有比這更好的方法?
- 9. 有沒有更好的方法來使用SQL查找anagrams?
- 10. 有沒有更好的方法來在angular2中有幫助者
- 11. 在CakePHP中,有沒有更好的方法來使用AES_DECRYPT?
- 12. 有沒有更好的方法來檢查字符串中的任何數字?
- 13. 有沒有更好的方法來檢查數據通道中的類型?
- 14. 有沒有更好的方法來檢查對象屬性的存在?
- 15. 有沒有更好的方法來檢查boost共享內存段的存在?
- 16. 有沒有更好的方法來檢索這些數據?
- 17. 有沒有最好的方法來關閉phpmyadmin令牌檢查?
- 18. 有沒有更好的方法來檢測Spring數據庫事務是否比使用TransactionSynchronizationManager.isActualTransactionActive()更有效?
- 19. 最好的方法來檢查一個URL是否有效
- 20. 在CakePHP中,有沒有更好的方法來選擇用戶名?
- 21. 有沒有更好的方法來做這個查詢?
- 22. 有沒有更好的方法來編寫這個SQL查詢?
- 23. 有沒有更好的方法來做這個查詢?
- 24. 有沒有更好的方法來做這個MySQL查詢?
- 25. 有沒有更好的方法來做這些MySQL查詢?
- 26. 有沒有更好的方法來編寫這個MySQL查詢?
- 27. 有沒有更好的方法來完成這個SQL查詢?
- 28. 有沒有更好的方法來解析MongoDB查詢?
- 29. 有沒有更好的方法來創建此案例查詢
- 30. 有沒有辦法檢查用戶是否使用JQuery登錄?