所以我设置了到特定操作、控制器和模块的默认路由。现在,当有人访问该站点时,它将默认在那里。
我已经设置了身份验证和授权,最初它会默认为用户未登录时的登录操作。
然而,情况不再如此,我真的不想使用:
$auth = Zend_Auth::getInstance();
if !($auth->hasIdentity())
{
$this->_redirect('/admin/user/login');
}
如果有更优雅的方式...
好吧,我在预调度方法中有一个优雅的解决方案:
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');
}
}
看起来更优雅,但不起作用
重定向到某些页面:
return $this->redirect()->toRoute('/admin/user/login');
检查是否允许用户查看必须在其他地方实现的页面(我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"等路由,您需要创建单独的导航条目。但这会产生相当大的问题,因为创建动态内容的最佳位置是控制器,但您无法在控制器中创建它,因为您无法在控制器插件之前从控制器运行代码,其中您使用导航来获取有关页面权限和资源的信息。
因此,您可以为每个动态内容(例如新闻,博客,cms模块)创建控制器插件,这不是一个糟糕的选择。
这种方法的优点:您已经有了导航树(动态创建的),您拥有用于确定每个页面权限的工具,ACL 检查位于一个位置(并非在每个控制器中或更糟糕的每个操作中)。
重要的事情:ACL 检查需要在 preDispatch 中或之前完成,之后在没有 acl 检查的情况下调度操作。