0

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

我知道我可以使用 if...else 语句来做一个简单的布尔检查(甚至做一个),但我希望有一种更优雅的方式来处理它,并且在... ifif(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也不错...

4

2 回答 2

1

如果您需要一个不错的 ACL 模块,您可以使用Zend Framework 的 Acl是包含 Zend 框架的 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
    }
}

这是,你在找什么?

于 2012-05-21T09:18:49.110 回答
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';
  }
}
于 2012-05-21T06:47:02.417 回答