189 lines
6.4 KiB
PHP
189 lines
6.4 KiB
PHP
<?php
|
|
namespace Admin\Controller;
|
|
use Think\Controller;
|
|
class AdminController extends Controller {
|
|
/**
|
|
* 后台控制器初始化
|
|
*/
|
|
protected function _initialize(){
|
|
//auth验证
|
|
define('UID',is_login());
|
|
if( !UID ){// 还没登录 跳转到登录页面
|
|
//如果是ajax请求,则用error方法输入提示(error方法可以识别是否是ajax)
|
|
if(IS_AJAX){
|
|
$this->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 朱亚杰 <xcoolcc@gmail.com>
|
|
*/
|
|
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 朱亚杰 <xcoolcc@gmail.com>
|
|
*/
|
|
protected function checkDynamic(){
|
|
if(IS_ROOT){
|
|
return true;//管理员允许访问任何页面
|
|
}
|
|
return null;//不明,需checkRule
|
|
}
|
|
|
|
|
|
/**
|
|
* action访问控制,在 **登陆成功** 后执行的第一项权限检测任务
|
|
*
|
|
* @return boolean|null 返回值必须使用 `===` 进行判断
|
|
*
|
|
* 返回 **false**, 不允许任何人访问(超管除外)
|
|
* 返回 **true**, 允许任何管理员访问,无需执行节点权限检测
|
|
* 返回 **null**, 需要继续执行节点权限检测决定是否允许访问
|
|
* @author 朱亚杰 <xcoolcc@gmail.com>
|
|
*/
|
|
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;
|
|
}
|
|
} |