error('登陆验证信息不存在,请重新登陆',U('Public/login')); }else{ $this->redirect(U('Public/login')); } } //多语言 if(C("LANG_SWITCH_ON")){ $this->LANG_OPT=C("LANG_OPT"); $this->admin_lang= session("admin_lang"); } //是否是超级管理员 define('IS_ROOT', is_administrator()); if(!IS_ROOT && C('ADMIN_ALLOW_IP')){ // 检查IP地址访问 if(!in_array(get_client_ip(),explode(',',C('ADMIN_ALLOW_IP')))){ $this->error('403:禁止访问'); } } // 检测访问权限 $access = $this->accessControl(); //检测非动态权限 $rule = strtolower(CONTROLLER_NAME.'/'.ACTION_NAME); //根据用户查询节点 $role_ids=M("role_user")->where(array("user_id"=>UID))->getField("role_id",true); $node_rs=array(); if($role_ids){ $node_ids=M("access")->join("left join __ROLE__ on __ACCESS__.role_id = __ROLE__.id")->where(array("status"=>1,"role_id"=>array("in",$role_ids)))->getField("node_id",true); if($node_ids){ $node_rs=M("node")->where(array("id"=>array("in",$node_ids)))->order("pid desc")->select(); } } C('ROLE_NODE_RS',$node_rs); // if ( $access === false ) { $this->error('403:禁止访问'); }elseif( $access === null ){ $dynamic = $this->checkDynamic();//检测分类栏目有关的各项动态权限 if( $dynamic === null ){ if ( !$this->checkRule($rule,1)){ $this->error('未授权访问!'); } }elseif( $dynamic === false ){ $this->error('未授权访问!'); } } //左侧菜单 $this->assign('__MENU__', $this->getMenus()); //页面标题 $path=CONTROLLER_NAME."/".ACTION_NAME; $pagetitle=M("node")->where(array("name"=>$path))->order("pid desc")->getField("title"); $this->assign("pagetitle",$pagetitle); //模型循环 $where=array(); $where["pid"]=0; $where["status"]=1; if($this->admin_lang){ $where["lang"]=$this->admin_lang; } // $catData=M("cat")->where($where)->order("sort asc,catid desc")->select(); $role=session("role"); $this->role=$role; foreach($catData as $v){ if(strstr($role[info_view],"|".$v[catid]."|")||IS_ROOT){ $modeldate[]=$v; } } $this->modeldate=$modeldate; //记录一级栏目session便于栏目高亮 if($_GET[catid]&&$GLOBALS[cat][$_GET[catid]][pid]==0){ session("currentCatid",$_GET[catid]); } $this->currentCatid=session("currentCatid"); } /** * 权限检测 * @param string $rule 检测的规则 * @param string $mode check模式 * @return boolean * @author 朱亚杰 */ final protected function checkRule($rule){ if(IS_ROOT){ return true;//管理员允许访问任何页面 } $rule=strtolower($rule); //这里只针对 已经添加过节点的控制器做验证,未增加到node表中的不做验证 $node=D('node')->field('name')->select(); //转小写 $s_node=array(); foreach($node as $v){ $s_node[]=strtolower($v[name]); } if(!in_array($rule,$s_node)) { return true; } //对角色节点做验证 foreach(C('ROLE_NODE_RS') as $v){ $name=strtolower($v[name]); if($name==$rule){ return true; } } return false; } /** * 检测是否是需要动态判断的权限 * @return boolean|null * 返回true则表示当前访问有权限 * 返回false则表示当前访问无权限 * 返回null,则会进入checkRule根据节点授权判断权限 * * @author 朱亚杰 */ protected function checkDynamic(){ if(IS_ROOT){ return true;//管理员允许访问任何页面 } return null;//不明,需checkRule } /** * action访问控制,在 **登陆成功** 后执行的第一项权限检测任务 * * @return boolean|null 返回值必须使用 `===` 进行判断 * * 返回 **false**, 不允许任何人访问(超管除外) * 返回 **true**, 允许任何管理员访问,无需执行节点权限检测 * 返回 **null**, 需要继续执行节点权限检测决定是否允许访问 * @author 朱亚杰 */ final protected function accessControl(){ if(IS_ROOT){ return true;//管理员允许访问任何页面 } $allow = C('ALLOW_VISIT'); $deny = C('DENY_VISIT'); $check = strtolower(CONTROLLER_NAME.'/'.ACTION_NAME); if ( !empty($deny) && in_array_case($check,$deny) ) { return false;//非超管禁止访问deny中的方法 } if ( !empty($allow) && in_array_case($check,$allow) ) { return true; } return null;//需要检测节点权限 } //菜单 public function getMenus(){ $field=array("id","name","title","pid","status","icon"); $and=array(); $and["is_hide"]=0; if(!APP_DEBUG){ $and["is_dev"]=0; } $data=M("node")->field($field)->where($and)->order('sort asc')->select(); //检测权限 foreach($data as $v){ if (!$this->checkRule($v['name'])){ continue; }else{ $result[]=$v; } } // $data=node_merge($result); return $data; } }