标签:zend-navigation zend-acl zend-auth php
我正在处理“私人”应用程序,您必须登录才能进行任何操作.这给我加载Zend Navigation的角色带来了一些问题.目前,我正在引导程序中“初始化” Zend Navigation;很好,直到我向Zend Nav添加ACL.问题是我想从我的身份验证存储中加载“ userRole”,但是直到用户登录后才存在存储,因此在登录页面上出现“正在尝试获取非对象属性”警告.这是因为在登录之前,auth的存储区中没有任何内容,因此auth-> userRole为“无”,因为auth-> getInstance()-> getIdentity()-> ???将为空,直到用户登录并配置了auth.
我没有在登录页面上使用Zend Nav,实际上,我为登录页面提供了另一种布局(根本没有导航); ‘if!$auth-> hasIdentity'(false)使用登录布局,仅在整个系统范围内显示该问题的登录页面,因为我说过该应用程序是完全私有的,因此默认为’guest’角色或类似角色似乎是一种“肮脏”的方法,因为一旦用户登录,它就必须以任何方式重新配置身份验证.只是为了取悦登录页面而设置通用身份验证身份似乎不合适.
我要说的是,在哪里移动Zend Nav的“ init”或至少移动configure ACL的好地方?还是可以搬动整个东西?
这是我在bootstrap.php中用于Zend导航的内容:
protected function _initNavigation() {
$this->_logger->info('Bootstrap ' . __METHOD__);
$this->bootstrap('layout');
$layout = $this->getResource('layout');
$view = $layout->getView();
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$acl = new Application_Model_Acl_Acl();
$role = Zend_Auth::getInstance()->getIdentity()->userRole;
$view->navigation($container)->setAcl($acl)->setRole($role);
}
引导运行时,“ $role = Zend_Auth :: getInstance()-> getIdentity()-> userRole”为空(或非对象).
我的所有ACL要么发生在控制器中(在操作中),要么某些发生在模型中的某个时刻,尽管我不反对Web服务或其他任何东西,所以也许它们将留在控制器中,但是我有灵活性,因为我在模型中有ACL(那是“域”吧?
我仅在Zend Nav上使用ACL进行布局和用户体验.我从Zend Nav获得的菜单和链接将根据用户角色为“灰色”,不存在或处于活动状态(并且可见),例如,“用户”角色将不会获得许多“管理员”选项,这是由控制器中的ACL强制执行,因此不能简单地键入url并到达某个区域.
我的另一个想法是,也许我应该针对这种情况考虑将登录名移入引导程序,但是我不确定这是否是个好主意?
编辑:
这是我放入前端控制器插件中的代码:
class Plugins_Controller_ZendNavInit extends Zend_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
$container = new Zend_Navigation($config);
$acl = new Application_Model_Acl_Acl();
$layout = Zend_Layout::getMvcInstance();
$view = $layout->getView();
$role = Zend_Auth::getInstance()->getIdentity()->userRole;
$view->navigation($container)->setAcl($acl)->setRole($role);
}
}
}
效果很好;我当然必须像其他任何人一样注册我的插件.我还将身份验证检查也移到了前控制器插件上.
解决方法:
您可以在登录之前建立匿名角色,并为匿名用户处理非常简短的ACL策略.
例如,检查this response,了解如何使用Auth插件在PreDispatch上捕获未经身份验证的用户.
标签:zend-navigation,zend-acl,zend-auth,php 来源: https://codeday.me/bug/20191102/1993266.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。