zf权限问题无非就是两种情况(据我所知)
第一种:(上一篇权限问题所说的)把权限写入数据库,从数据库取出权限与acl.ini文件中的权限对比。
第二种:根据登录情况的不同,赋予当前用户不同的权限,这些权限与acl.ini文件中的权限对比。
不同点两种方法无非一个权限已写入数据库,一个权限在程序中赋予。相同点都和acl.ini文件中的权限做对比。
acl.ini文件中的权限处理
acl.ini文件:(如application->modules->default->configs目录下,default是模块名,模块名可更改)
[production]
*.* = admin,actived,logined
[testing : production]
[development : production]
[local : production]
[localdata : development]
处理acl.ini文件的类
Acl.php文件:(如library->Ata->Account目录下,Ata是自定义的类库名)
<?php
class Ata_Account_Acl
{
static public function hasAcl($roles, $request){
$ACL_FILE = APPLICATION_PATH . "/modules/{$request->getModuleName()}/configs/acl.ini";
if(!file_exists($ACL_FILE)) return true;
try{$acl = new Zend_Config_Ini($ACL_FILE, APPLICATION_ENV);
$acl_controller = $acl->toArray();
}catch(Exception $e){
try{$acl = new Zend_Config_Ini($ACL_FILE, 'production');
$acl_controller = $acl->toArray();
}catch(Exception $e){return false;}
}
$result = false;
foreach($acl_controller as $controller => $acl_action){
if( '*'!=$controller && $request->getControllerName()!=$controller){continue;}
foreach($acl_action as $action => $access){
if( '*'!=$action && $request->getActionName()!=$action){continue;}
$result = (boolean)count(array_intersect($roles, explode(',',$access)))>0;
}
}
return $result;
}
}
主要判断acl.ini文件中的权限是否与程序中的权限有交集,有交集就证明有权限,无交集就证明无权限。
Ata_Controller_Action.php 文件
<?php
class Ata_Controller_Action extends Zend_Controller_Action
{
public function preDispatch()
{
parent::preDispatch();
$roles = array('guest');
if($this->user){ //如果用户登录了,$roles增加'login'
$roles[] = 'login';
}
if(!Ata_Account_Acl::hasAcl($roles, $this->_request)){ //判断acl.ini文件中的权限与$roles是否有交集 没有执行noAcl()方法
$this->noAcl();
}
}
public function noAcl()
{
if(!in_array('login', $roles)){ //判断它是否登录了
if(!$this->_request->isXmlHttpRequest()){ //判断是否是ajax请求,不是ajax请求,用session记录url
}
$this->doNoAcl("请先登录","/sign");
}
$this->doNoAcl('权限不足', '/');
}
public function doNoAcl($msg, $url)
{
if($this->_request->isXmlHttpRequest()){ //判断是否是ajax请求,不是ajax请求跳转页面,是ajax请求不跳转页面
echo $msg;exit;
}else{
$this->_redirect($url);
}
}
}