所以我设置了一个到特定操作,控制器和模块的默认路由。 现在,当有人访问该网站时,它将默认在那里。
我已经设置了身份验证和授权,并且最初在用户未登录时默认为登录操作。
然而事实并非如此,我真的不想使用:
$auth = Zend_Auth::getInstance();
if !($auth->hasIdentity())
{
$this->_redirect('/admin/user/login');
}
如果有更优雅的方式......
我在preDispatch方法中有这个优雅的解决方案:
if (!$acl->isAllowed($role, $controller, $action))
{
if ($role == 'guest')
{
$request->setControllerName('user');
$request->setActionName('login');
$request->setModuleName('admin');
}
else
{
$request->setControllername('error');
$request->setActionname('noauth');
}
}
似乎更优雅但不起作用
答案 0 :(得分:0)
要重定向到某些页面:
return $this->redirect()->toRoute('/admin/user/login');
答案 1 :(得分:0)
检查是否允许用户查看页面必须在其他地方实现(我为该操作预先设置了X_Controller_Plugin)。我找到使用Acl的最佳方法是向导航添加有关每个页面权限和资源的信息
<?php
Zend_Navigation_Page_Mvc::factory(
array(
'label' => 'home',
'route' => 'home',
'privilege' => 'view',
'resource' => 'guest',
'pages' => array(...)
)
);
以这种方式创建导航会强制您在Bootstrap中创建导航并为动态内容创建页面。对于诸如'/ @ news / @ read /:id'之类的路由,您需要创建单独的导航条目。但这会产生很大的问题,因为创建动态内容的最佳位置是控制器,但是您无法在控制器中创建它,因为您无法在控制器插件之前从控制器运行代码,您可以使用导航获取有关页面权限和资源的信息。 / p>
因此,您可以为每个动态内容(例如新闻,博客,cms模块)创建控制器插件,这不是一个糟糕的选择。
这种方法的优点: 您已经有了导航树(动态创建),您可以使用工具确定每个页面的权限,acl检查在一个地方(不是在每个控制器中,或者在每个操作中都更糟)。
重要的是:acl检查需要在preDispatch之前或之前完成,之后调度该点操作而不进行acl检查。