0

所以我设置了一个到特定动作、控制器和模块的默认路由。现在,当有人访问该站点时,它将默认在那里。

我已经设置了身份验证和授权,最初它会在用户未登录时默认为登录操作。

但是,情况不再如此,我真的不想使用:

$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');
            }
        }

看起来更优雅但不起作用

4

2 回答 2

0

重定向到某些页面:

   return $this->redirect()->toRoute('/admin/user/login');
于 2013-11-14T07:51:44.693 回答
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”之类的路线,您需要创建单独的导航条目。但这会产生很大的问题,因为动态创建内容的最佳位置是控制器,但您不能在控制器中创建它,因为您无法在控制器插件之前从控制器运行代码,您可以使用导航来获取有关页面权限和资源的信息。

因此,您可以为每个动态内容(例如新闻、博客、cms 模块)创建控制器插件,这不是那么糟糕的选择。

这种方法的优点: 你已经有了导航树(它是动态创建的),你有工具来确定每个页面的权限,acl 检查在一个地方(不是在每个控制器中或更糟糕的是在每个操作中)。

重要的是:需要在 preDispatch 中或之前完成 Acl 检查,然后在没有 acl 检查的情况下分派动作。

于 2013-11-14T08:17:38.733 回答