如果用户未登录 Zend 框架,则如何默认登录屏幕


How to Default to the Login Screen if a user is not Logged in Zend Framework?

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

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

然而,情况不再如此,我真的不想使用:

$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 检查的情况下调度操作。