ACL检查失败时绕过method()/ function()代码。不使用IF语句,或返回;

时间:2012-05-21 03:41:35

标签: php kohana kohana-3

我正在使用Kohana 3.2和Controller_Template。基本上我想做的是检查每个action_method的ACL。如果失败,请加载拒绝访问视图并跳过其余的action_method代码;否则继续加载。

我知道我可以使用if ... else语句进行简单的布尔检查(甚至做if(check_permission())return;),但我希望有一种更优雅的方式来处理它,只需要少量的action_page()中的无关代码...如果可能,只需check_permission();。我可以在function check_permission()

中添加更多代码
function check_permission() {
    $this->template->content = View::factory('system/access_denied')
        ->bind('title', $title);
    $title = 'Access Denied';
}

function action_page() {
    check_permission();

    $this->template->content = View::factory('page/index')
        ->bind('title', $title);
        ->bind('data', $data);

    $title = 'Page loaded';
    .
    .
    .
}

也许kohana有一些特别的方法可以达到这个目的吗?原生php也很好......

2 个答案:

答案 0 :(得分:1)

如果您需要一个不错的ACL模块,可以使用Acl of the Zend FrameworkHere是包含Zend Framework的Kohana模块。

你可以像这样使用它:

启动:

$acl = new Zend_Acl();

添加角色:

$acl->addRole(new Zend_Acl_Role('guest'))
  ->addRole(new Zend_Acl_Role('member'))
  ->addRole(new Zend_Acl_Role('admin'));

添加资源(控制器):

$acl->add(new Zend_Acl_Resource('someController'));

允许访问资源(控制器)的角色和权限(操作):

 $acl->allow('member', 'someController' array('page'));

然后检查你的方法是否允许用户:

public function befor() 
{
    $role = .... // role from user
    $resource = $this->request->controller();
    $action = $this->request->action();

    if ($acl->isAllowed($role, $resource, $action)) 
    {
      //...redirect
    }
}

这是你想要的吗?

答案 1 :(得分:0)

我认为Request::current()->redirect('...') befor()会帮助您。

像这样:

  public function befor() 
  {
    parent::befor();

    if (... have no access) 
    {
       Request::current()->redirect('access/denied');
    }
  }

...

Class Access extends Controller_Template {

  public function action_denied() 
  {
    $this->template->content = View::factory('system/access_denied')
        ->bind('title', $title);
    $title = 'Access Denied';
  }
}