我正在使用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也很好......
答案 0 :(得分:1)
如果您需要一个不错的ACL模块,可以使用Acl of the Zend Framework。 Here是包含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';
}
}