权限访问控制总结

原创 2018-11-16 17:24:36 294
摘要:<?php /* 权限访问控制 */ //基类 class Base extends Controller { public function __construct(){ parent::__construct(); //admin是一个一维数组 $this->_admin = session(&
<?php
/*
权限访问控制
*/
//基类
class Base extends Controller
{
	public function __construct(){
		parent::__construct();

		//admin是一个一维数组

		$this->_admin = session('admin');
		if(!$this->_admin){
			
			//数据不合法直接重定向到登录页面

			$this->redirect('account/login');
			exit;
		}
		$this->assign('admin',$this->_admin);
		
		// 判断用户是否有权限
		$group = Db::table('admin_groups')->where('gid',$this->_admin['gid'])->find();
		if(!$group){
			$this->request_error('对不起,您没有权限');
		}

		$rights = json_decode($group['rights']);

		// 当前访问的菜单

		$controller = request()->controller();
		$method = request()->action();

		//查找与当前控制器和方法对应的数据组

		$res = Db::table('admin_menus')->where('controller',$controller)->where('method',$method)->find();
		if(!$res){
			$this->request_error('对不起,您访问的功能不存在');
		}
		if($res['status'] == 1){
			$this->request_error('对不起,该功能已禁止使用');
		}
		if(!in_array($res['mid'],$rights)){
			$this->request_error('对不起,您没有权限');
		}

	}

	private function request_error($msg){
		if(request()->isAjax()){
			exit(json_encode(['code'=>1,'msg'=>$msg]));
		}
		exit($msg);
	}

}


//HOME类

class Home extends Base{

    public function index(){

    	//查询当前用户所拥有的权限信息

    	$role = Db::table('admin_groups')->where('gid',$this->_admin['gid'])->find();
    	if($role){

    		//把当前用户的【rights】json字符串数据强制转换成数组格式

    		$role['rights'] = $role['rights']?json_decode($role['rights'],true):[];
    	}
    	if($role['rights']){

    		$where = 'mid in('.implode(',', $role['rights']).') and ishidden=0 and status=0';

    		//自定义索引mid查找出所有符合条件的数据($menus数据是以MID为索引的二维数组)

    		$menus = $this->db->table('admin_menus')->where($where)->cates('mid');

    		//把查询的数据树状层级显示

    		$menus && $menus = $this->gettreeitems($menus);
    	}

    	$data['menus'] = $menus;
    	$data['role'] = $role;
    	return $this->fetch('',$data);
	}

	public function welcome(){
		return $this->fetch();
	}

	private function gettreeitems($items){
		$tree = [];
		foreach ($items as $item) {

			//判断有没有以“$item['pid']”为索引的数据(说人话即:索引为$item['pid']的数据是否存在子类)			

			if(isset($items[$item['pid']])){

				//把平级数组中(一级菜单数组)有子类的将对应的子类数组移到自身新添的children字段中,达到有层级的效果

				$items[$item['pid']]['children'][] = &$items[$item['mid']];

			}else{

				//把所有的一级菜单数组【没有子类的】挨个追加到新数组tree中

				$tree[] = &$items[$item['mid']];
			}
		}
		return $tree;
	}
}

权限访问控制中,运用引用传值达到无限分类的方法,多少还是有些不大理解,怎么才能熟练的运用引用传值,老师有啥好的建议,可以做一节课单独讲引用传值在开发中的运用吗

批改老师:韦小宝批改时间:2018-11-16 17:49:41
老师总结:写的很不错!熟练掌握也就是多写!你可以尝试着删除点东西再补上!结果不一样!然后再去想这一步干了些什么!加油吧!

发布手记

热门词条