Initial commit
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user