脚本宝典收集整理的这篇文章主要介绍了php – 如何在Zend Framework中进行preDispatch转发?,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
这种情况非常简单:如果用户未登录,则应将其转发到同一控制器或另一个控制器中的loginAction.
这将导致无限循环,因为调度过程再次重新开始,再次调用PReDispatch并且转发将再次启动所有内容.
我能想到的唯一解决方案是检查是否已在请求中设置LOGinAction.
所以我的问题是,复杂的开发人员将如何处理这个问题?
UPDATE
刚刚点击发送按钮后,神圣意识的鬼魂就出现了;)
另一个想法是构建一个LoginController来处理登录请求.还是有更好的方法?
请注意,我使用的是Doctrine,因此显然不能将其剪切并粘贴到您的应用程序中,但它应该以最小的更改运行.我删除了一些特定于我的应用程序的方法,但所有通用身份验证foo都在那里.
插入
<?PHP class Hobo_Controller_Plugin_Auth extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $auth = Zend_Auth::getInstance(); if ($auth->hasIdentITy()) { if ('logout' != $request->getActionName()) { if (! $request->getParam('force_password_change') && $this->_checkPasswordExpiry($auth->getIdentity()->username) ) { $request->setParam('force_password_change',true); $request->setModuleName('default') ->setControllerName('auth') ->setActionName('change-password'); } } } else { // Defer more complex authentication logic to AuthController if ('auth' != $this->getRequest()->getControllerName()) { $redirector = Zend_Controller_Action_HelPErbroker::getstaticHelper('redirector'); $redirector->gotoSimple('restricted','auth'); } } } protected function _checkPasswordExpiry($username) { // Look up user and return true if password is expired } }
AuthController
<?PHP class AuthController extends Zend_Controller_Action { public function init() { $this->_auth = Zend_Auth::getInstance(); $this->_errorMessenger = new Zend_Controller_Action_Helper_flashmessenger(); $this->_errorMessenger->setActionController($this)->init(); $this->_errorMessenger->setnamespace('error'); $this->_noticeMessenger = new Zend_Controller_Action_Helper_FlashMessenger(); $this->_noticeMessenger->setActionController($this)->init(); $this->_noticeMessenger->setNamespace('notice'); $this->view->errors = $this->_errorMessenger->getMessages(); $this->view->notices = $this->_noticeMessenger->getMessages(); } public function preDispatch() { if (! $this->_auth->hasIdentity()) { if (! in_array($this->_request->getActionName(),array( 'logout','identify','forgot-password','reset-password','restricted')) ) { $this->_redirect('/auth/restricted'); } } } public function restrictedAction() { // Shows access restricted page } public function logoutAction() { $this->_auth->clearIdentity(); Zend_Session::destroy(); $this->_redirect('/'); } public function identifyAction() { if ($this->_request->isPost()) { $username = $this->_getParam('username'); $password = $this->_getParam('password'); if (empty($username) || empty($password)) { $this->_flashError('Username or password cannot be blank.'); } else { $user = new dUser(); $result = $user->login($username,$password); if ($result->isValid()) { $user->FromArray((array) $this->_auth->getIdentity()); if ($this->_getParam('changepass') || $user->is_password_expired) { $this->_redirect('auth/change-password'); return; } $this->_doRedirect($user); return; } else { $this->_doFailure($result->getIdentity()); } } } $this->_redirect('/'); } public function changePasswordAction() { if ($this->_request->isPost()) { $username = $this->_auth->getIdentity()->username; $formData = $this->_request->getParams(); if (empty($formData['password']) || empty($formData['new_password']) || empty($formData['confirm_password']) ) { $this->_flashError('Password cannot be blank.'); $this->_redirect('auth/change-password'); } elseif ($formData['new_password'] !== $formData['confirm_password']) { $this->_flashError('Password and confirmation do not match.'); $this->_redirect('auth/change-password'); } else { $user = new dUser(); $result = $user->login($username,$formData['password']); if ($result->isValid()) { $user->updatePassword($username,$formData['new_password']); $this->_flashNotice('Password updated successfully!'); $this->_redirect('/'); } else { $this->_flashError('Invalid username or password!'); $this->_redirect('auth/change-password'); } } } if ($this->_getParam('force_password_change')) { $this->view->notice = 'Your password has expired. You must change your password to continue.'; } } public function forgotPasswordAction() { if ($this->_request->isPost()) { // Pseudo-random uppercase 6 digit hex value $resetCode = strtoupper(substr(sha1(uniqid(rand(),true)),6)); Doctrine_Query::create() ->update('dUser u') ->set('u.reset_code','?',array($resetCode)) ->where('u.username = ?',array($this->_getParam('username'))) ->execute(); $this->_doMail($this->_getParam('username'),$resetCode); $this->_flashNotice("Password reset request received."); $this->_flashNotice("An email with further instructions,including your <em>Reset Code</em>,has been sent to {$this->_getParam('username')}."); $this->_redirect("auth/reset-password/username/{$this->_getParam('username')}"); } } public function resetPasswordAction() { $this->view->username = $this->_getParam('username'); $this->view->reset_code = $this->_getParam('reset_code'); if ($this->_request->isPost()) { $formData = $this->_request->getParams(); if (empty($formData['username']) || empty($formData['reset_code'])) { $this->_flashError('Username or reset code cannot be blank.'); $this->_redirect('auth/reset-password'); } elseif ($formData['new_password'] !== $formData['confirm_password']) { $this->_flashError('Password and confirmation do not match.'); $this->_redirect('auth/reset-password'); } else { $user = new dUser(); $result = $user->loginWithresetCode($formData['username'],$formData['reset_code']); if ($result->isValid()) { $user->updatePassword($result->getIdentity(),$formData['new_password']); $user->fromArray((array) $this->_auth->getIdentity()); $this->_flashNotice('Password updated successfully!'); $this->_doRedirect($user); } else { $this->_doFailure($result->getIdentity()); $this->_redirect('auth/reset-password'); } } } } protected function _doRedirect($user) { $this->_helper->Redirector->gotoUserDefault($user); } protected function _flashError($message) { $this->_errorMessenger->addMessage($message); } protected function _flashNotice($message) { $this->_noticeMessenger->addMessage($message); } protected function _doFailure($username) { $user = Doctrine_Query::create() ->from('dUser u') ->select('u.is_locked') ->where('u.username = ?',array($username)) ->fetchOne(); if ($user->is_locked) { $this->_flashError('This account has been locked.'); } else { $this->_flashError('Invalid username or password'); } } }
以上是脚本宝典为你收集整理的php – 如何在Zend Framework中进行preDispatch转发?全部内容,希望文章能够帮你解决php – 如何在Zend Framework中进行preDispatch转发?所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。