权限过滤类 Filter.php

作者:root

2017.04.23 修改 _check 函数;
<?php
/*
 *  权限过滤类,如没有许可权限,再做进一步的权限对比。
 * 比如:作者对自己作品的编辑删除权限。
 *
 * */
class libc_Filter{
    // 显示 1 ,添加 2,修改 8,删除 8
    /* 作者 默认对自己的作品 有编辑的权利 ,包括 编辑和删除 */
    public $isowner = 1; 
   /* 修改为 public  */
    public $perm = array (
        'ls'  => 1,
        'read'  => 1,  
        'write' => 2, 
        'edit'  => 8, 
        'del'   => 8
	);
    /*免检路由数组*/
    private $free = array('login:get');
    
    public  $data = array();
    /* 保存单例类引用 */
    private static $_instance;
    /* 初始化函数 */
    private function __construct(){
        
    }
    public function __destruct(){
	    unset($this->perm);
	    unset($this->free);
    } 
    /* 创建__clone方法防止对象被复制克隆 */
    private function __clone(){
        trigger_error('Clone is not allow!',E_USER_ERROR);
    }
    /* 返回单例对象 */
    public static function getInstance(){
        if(!(self::$_instance instanceof self)){
            self::$_instance = new self;
        }
        return self::$_instance;
    }
    private function _checkRoute(&$get=array()){
        return $this->_isFree($get) || $this->_isRoot() || $this->_isRoute($get);
        
    }
    #菜单:是否显示本条目$query: ?m=book&c=admin&ac=list, 
    # insert('sss','book','book/admin/list',isA('book/admin/list')){
    #   if(isA('book/admin/list')==flase) return false;
    #   ......
    #}
    public function isOK(&$query){
	    $ary = path_array($query);
        if($this->_checkRoute($ary)|| $this->isOwner($ary)){
            return true;
        }
        return false;
    }
    #页面:增删改连接$query: ?m=book&c=bookls&ac=edit&id=asfdg-admin ,'删除',$path:/test.php
    public function isA($query,$name,$str=null){
	    $url = $this->getURL($query);
	    if($url){
            echo '<a '.$str.'  href="'.$url.'" >'.$name.'</a>';
        }
    }
    public function getURL($query){
        if($this->isOK($query)){
	        if(View::getInstance()->sys['re_write'])
	            return $query = BASE_URL.$query;
            else
                return $query = BASE_URL.'index.php/'.$query;
        }else return false;
    }
    public function isBT($query,$name,$str=null){
        if($this->isOK($query)){
            if(View::getInstance()->sys['re_write'])
                $query = BASE_URL.$query;
            else
                $query = BASE_URL.'index.php/'.$query;
            echo '<button '.$str.'  type="submit" formaction="'.$query.'">'.$name.'</button>';
        }
    }
    // 是否有访问权限
    public function hasAccess(){
        
        return $this->_checkRoute($_GET);
    }
    private function _check($mod,$ac=null){
        $Route = View::getInstance()->auth->getAuthData('perms');
        if(array_key_exists($mod,(array)$Route) and array_key_exists($ac,(array)$this->perm)){
            return $Route[$mod] & $this->perm[$ac];
        }
        return false;
    }
    #是根用户?
    private function _isRoot(){
        if ('root'=== View::getInstance()->auth->getAuthData('ID')){
            return true;
        }
        return false;
    }
    #有路由权?
    private function _isRoute(&$get){ 
        return $this->_check($get['m'],$get['ac']);  
    }
    #是所有者?仅作为 超连接 及 按钮 是否显示的开关作用
    public function isOwner(&$get){
        if(!empty($get['id']) && $this->isowner){
            $ary = explode('-',$get['id']);
            if(count($ary) > 1){
                $uid = $ary[1];
                if(strcmp($uid,View::getInstance()->auth->getAuthData('ID'))===0){
                    return true;
                }
                return false;
            }
            return false;
        }
        return false;
	}
	# 免检路由?
    private function _isFree(&$get){
        return in_array($get['m'].':'.$get['ac'],$this->free);
	}
}
?>