我运行了一些Zend Framework应用程序,是时候添加用户访问限制了。我坚信你应该尽可能避免滚动自己的安全基础设施,所以我一直试图弄清楚如何使用Zend_Auth和Zend_Acl来实现它,到目前为止还没有成功。
我在网上搜索过,至少有一本书,我找不到如何将所有部分串在一起的例子。我找到了一个身份验证here的示例,授权/访问控制here和here的旧示例,以及未来的提案here,here和{ {3}},但我对ZF的理解还不足以将其全部放在一起。
我需要的是:一个简单的公共示例或教程,完全详细说明[作为可下载和可运行的代码]如何使用当前的Zend Framework版本(1.9.5,没有“提案”或“实验室”)来管理三个不同角色(例如,访客,成员,管理员)对三个用户(及其密码)的身份验证/授权/访问控制,以保护默认模块中的三个不同控制器。该示例应尽可能多地使用当前的ZF库。不,这不是功课;赌注高于: - (
如果它存在于我找不到的地方。任何帮助赞赏。 IMO对于ZF的新手来说非常有帮助。
披露:我在ZF上有一个社区维基问题here因为我正在试图弄清楚我是否会继续这样做。但我真的需要让我的应用程序立即运行!
答案 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']); } } } }