zf权限问题(第二种)

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);
		}
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值