如果ACL不允许访问页面,则ZF2重定向

时间:2014-04-11 17:57:11

标签: php zend-framework zend-framework2 zend-framework-routing

我有构建我的ACL树的模块,它正常工作。

我还在config / autoload目录中有一个导航配置文件,它详细说明了我的应用程序结构以及与条目相关的资源。我的应用程序模块配置中也有一个导航工厂。

所有这一切都运行正常,我根据登录用户角色的权限和导航配置中页面的资源来渲染我的菜单。

我能解决的是如何防止访问用户无法访问的页面(隐藏在渲染导航菜单中的页面)。我希望在一个模块中管理它。

我假设在我的Module.php文件中,在onBootstrap函数中,我需要针对ACL运行isAllowed并重定向(如此问题 - Forward to another controller/action from module.php)。然而,isAllowed似乎需要资源来查询。这需要从导航配置中获得。

如果我对isAllowed函数中所需的资源进行硬编码,我可以正常工作。实际上,我只需要从导航配置中获取当前页面请求的资源。

我确定这必须是标准功能,但我找不到任何具体的例子。

任何帮助表示感谢。

克里斯

2 个答案:

答案 0 :(得分:0)

这是您正在寻找的,还是您正在寻找如何从onBootstrap方法中访问您的配置?

public function onBootstrap($event) {
    $matched_route = $event->getRouteMatch()->getMatchedRouteName();
    $someOtherClass = new MyClassThatAuthenticatesRoutes();
    if(!($someOtherClass->isAllowed($matched_route)){
        $response = $event->getResponse();
        $response->setStatusCode(401);
        $response->setReasonPhrase('Not allowed!');
        return $response;
    }

如果你只是寻找配置,你可以去:

 $sm = $e->getApplication()->getServiceManager();
 $config = $sm->get('config');

答案 1 :(得分:0)

如果您需要匹配ACL的路由,请执行以下操作:

/**
 * Retrieve the route match
 * 
 * @return string
 */
protected function getMatchRoute()
{
    $router  = $this->getServiceLocator()->get('router');
    $request = $this->getServiceLocator()->get('request');      

    $this->routeMatch = $router->match($request)->getMatchedRouteName();

    return $this->routeMatch;
}

然后在你的控制器中:

// note, $acl is just a class I wrote to extend class Zend\Permissions\Acl\Acl
// because I needed additional functionality    
$acl = new \PATH_TO\Acl\Acl(); 

// checkAcl(), just however you plan on handling permissions
// $role is obviously just that, the role of the user, where ever 
// you are setting that.
// the second param is from the method in the above code block which is the 
// resource (page) you are wanting to check against
$access = $acl->checkAcl($role, $this->getMatchRoute());

// they don't have access so redirect them
if (!$access)
{
    return $this->redirect()->toRoute('your_route', array());
}

如果您需要查看更多代码,请告诉我,但希望这可以让您开始。