需要Zend Framework 1.9中的身份验证/授权/访问控制的完整示例

时间:2009-12-02 22:24:14

标签: php zend-framework

我运行了一些Zend Framework应用程序,是时候添加用户访问限制了。我坚信你应该尽可能避免滚动自己的安全基础设施,所以我一直试图弄清楚如何使用Zend_Auth和Zend_Acl来实现它,到目前为止还没有成功。

我在网上搜索过,至少有一本书,我找不到如何将所有部分串在一起的例子。我找到了一个身份验证here的示例,授权/访问控制herehere的旧示例,以及未来的提案herehere和{ {3}},但我对ZF的理解还不足以将其全部放在一起。

我需要的是:一个简单的公共示例或教程,完全详细说明[作为可下载和可运行的代码]如何使用当前的Zend Framework版本(1.9.5,没有“提案”或“实验室”)来管理三个不同角色(例如,访客,成员,管理员)对三个用户(及其密码)的身份验证/授权/访问控制,以保护默认模块中的三个不同控制器。该示例应尽可能多地使用当前的ZF库。不,这不是功课;赌注高于: - (

如果它存在于我找不到的地方。任何帮助赞赏。 IMO对于ZF的新手来说非常有帮助。

披露:我在ZF上有一个社区维基问题here因为我正在试图弄清楚我是否会继续这样做。但我真的需要让我的应用程序立即运行!

1 个答案:

答案 0 :(得分:1)

Pro Zend Framework Techniques,第8章对此有一个很好的处理。除了preDispatch方法之外,他的大多数方法与我使用的方法非常相似。在进行身份验证时,我有preDispatch重定向而不是静默调度到另一个控制器。我还保留了使用登录操作所请求的Url。

class SitePluginAuth extends Zend_Controller_Plugin_Abstract
{
 private $_auth;
 private $_acl;

 private $_noauthPath = '/account/log-in/';
 private $_noacl = array('module' => 'default', 'controller' => 'error', 'action' => 'denied');

 public function __construct($auth, $acl)
 {
  $this->_auth = $auth;
  $this->_acl = $acl;
 }

 public function preDispatch($request)
 {
  $resource = $request->controller;
  if (!$this->_acl->has($resource)) return;

  $controller = $request->controller;
  $action = $request->action;
  $module = $request->module;

  if ($this->_auth->hasIdentity()) {
   $identity = $this->_auth->getIdentity();
   $role = 'member';
  }
  else {
   $role = 'guest';
  }

  /*
   * Remember to URL encode the parameter value. Also, when you are processing the value of the 
   * redirect URL, make sure that it is a URL on your site or a relative URL to avoid any security 
   * attacks like a phishing scheme. Otherwise, a third party can target your site's login page and 
   * then redirect back to their site and might have access to the user's secured session.
   *
   * The reason I don't use the session to store the URL, is that search engine spiders can end up 
   * creating sessions as they hit links on your site that are secured and require login. Since they 
   * have no credentials, the session is created only to timeout 30 minutes later.
   */
  if (!$this->_acl->isAllowed($role, $resource, $action)) {
   if (!$this->_auth->hasIdentity()) {
    $requestedUrl = substr($request->getRequestUri(), strlen($request->getBaseUrl())); // relative url 
    $loginUrl = $this->_noauthPath.'?requestedUrl='.urlencode($requestedUrl);
    $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
    $redirector->gotoUrl($loginUrl);
   }
   else {
    $request->setModuleName($this->_noacl['module']);
    $request->setControllerName($this->_noacl['controller']);
    $request->setActionName($this->_noacl['action']);
   }
  }
 }
}