您的位置:首页 > 编程语言 > PHP开发

phpcms的admin.class.php

2016-04-01 16:11 477 查看
<?php

defined('IN_PHPCMS') or exit('No permission resources.');

/* phpcms v9 登录是采用session ,保存session 有两种方式,一种是数据库存储的方式,一种是文件存储方式,默认是数据库存储方式。有时数据库这种方式不行,可以在 \caches\configs\system.php 中修改sesion 的存储方式//Session配置 'session_storage' => 'mysql',将其改为//Session配置'session_storage' => 'files',反正是不能为空,否则不会登录成功。 */

$session_storage = 'session_'.pc_base::load_config('system','session_storage');//session存储方式存到文件

pc_base::load_sys_class($session_storage);

if(param::get_cookie('sys_lang')) { //语言包

define('SYS_STYLE',param::get_cookie('sys_lang')); //在登陆的时候被设置

} else {

define('SYS_STYLE','zh-cn');

}

//定义在后台

define('IN_ADMIN',true);

class admin {

public $userid;

public $username;

public function __construct() {

self::check_admin(); //判断用户是否已经登陆

self::check_priv(); //检查该用户是否有权限

pc_base::load_app_func('global','admin');

if (!module_exists(ROUTE_M)) showmessage(L('module_not_exists'));//模块不存在提示的信息

self::manage_log();

self::check_ip(); //检测被禁止的ip

self::lock_screen(); //锁屏

self::check_hash(); //hash安全验证

if(pc_base::load_config('system','admin_url') && $_SERVER["HTTP_HOST"]!= pc_base::load_config('system','admin_url')) {

Header("http/1.1 403 Forbidden"); //设置无权访问

exit('No permission resources.');

}

}

/**

* 判断用户是否已经登陆

*/

final public function check_admin() {

//如果在登录界面

//ROUTE_M获取模型,ROUTE_C获取控制器,ROUTE_A获取事件

if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'public_card'))) {

return true;//一旦返回true,将终止后续代码的执行

} else {

//判断session是否有userid,roleid,如果有的话不做处理,没有的话返回登陆界面

$userid = param::get_cookie('userid');

if(!isset($_SESSION['userid']) || !isset($_SESSION['roleid']) || !$_SESSION['userid'] || !$_SESSION['roleid'] || $userid != $_SESSION['userid']) showmessage(L('admin_login'),'?m=admin&c=index&a=login');

}

}

/**

* 加载后台模板

* @param string $file 文件名

* @param string $m 模型名

*/

final public static function admin_tpl($file, $m = '') {

$m = empty($m) ? ROUTE_M : $m;

if(empty($m)) return false; //判断$m为空返回false

return PC_PATH.'modules'.DIRECTORY_SEPARATOR.$m.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$file.'.tpl.php'; //返回modules/ROUTE_M/templates/ 后缀为$file.tpl.php

}

/**

* 获取管理菜单

* 按父ID查找菜单子项

* @param integer $parentid 父菜单ID

* @param integer $with_self 是否包括他自己

* @param 菜单是存储在menu数据表中的。当我们二次开发需要新增菜单时候,只需要在menu表中插入相应menu的id、name、parentid、m、c、a、data等信息即可。当然为了让除了超级管理员之外的角色可以访问该menu,还需要在admin_role_priv表中配置权限。

*/

final public static function admin_menu($parentid, $with_self = 0) {

$parentid = intval($parentid); //获取变量的整数值,默认是十进制

$menudb = pc_base::load_model('menu_model'); //引用model子类,实现数据库等操作

$site_model = param::get_cookie('site_model'); //model子类

$where = array('parentid'=>$parentid,'display'=>1); //parentid父节点id

if ($site_model && $parentid) {

$where[$site_model] = 1;

}

//获取其全部的子菜单

$result =$menudb->select($where,'*',1000,'listorder ASC'); //listorder就是后台中排序前那个号来排序,可以进行编辑

if($with_self) {

$result2[] = $menudb->get_one(array('id'=>$parentid));

$result = array_merge($result2,$result); //array_merge — 将数组的值赋给上一个数组

}

//权限检查。如果是超级管理员,则全部返回

if($_SESSION['roleid'] == 1) return $result; //将角色id存入session

//找出有权限的部分(根据admin_role_priv_model表)

$array = array();

$privdb = pc_base::load_model('admin_role_priv_model'); //调用model子类

$siteid = param::get_cookie('siteid');

foreach($result as $v) {

$action = $v['a'];

//对于公有方法,放行通过

if(preg_match('/^public_/',$action)) { //前缀为public

$array[] = $v;

} else {

//对于ajax开头的方法,只截取后半部分方法名

if(preg_match('/^ajax_([a-z]+)_/',$action,$_match)) $action = $_match[1];

//尝试获取当前角色$roleid是否有对应的m、c、a的操作权限记录//尝试获取当前角色$roleid是否有对应的m、c、a的操作权限记录

$r = $privdb->get_one(array('m'=>$v['m'],'c'=>$v['c'],'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));

if($r) $array[] = $v; //判断$r。。将$v赋值给一个$array[]

}

}

return $array;

}

/**

* 获取菜单 头部菜单导航

*

* @param $parentid 菜单id

* @param 主要是用来生成相关菜单的所有子菜单导航(一般显示在iframe框架内容页的上部)

*/

final public static function submenu($parentid = '', $big_menu = false) {

if(empty($parentid)) {

$menudb = pc_base::load_model('menu_model'); //引用model子类

$r = $menudb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>ROUTE_A));

$parentid = $_GET['menuid'] = $r['id']; //

}

$array = self::admin_menu($parentid,1); //父菜单$parentid中的名字,包括父菜单

$numbers = count($array); //计算数组中的单元数目或对象中的属性个数

if($numbers==1 && !$big_menu) return '';

$string = '';

$pc_hash = $_SESSION['pc_hash'];

foreach($array as $_value) {

if (!isset($_GET['s'])) {

$classname = ROUTE_M == $_value['m'] && ROUTE_C == $_value['c'] && ROUTE_A == $_value['a'] ? 'class="on"' : '';

} else {

$_s = !empty($_value['data']) ? str_replace('=', '', strstr($_value['data'], '=')) : '';

$classname = ROUTE_M == $_value['m'] && ROUTE_C == $_value['c'] && ROUTE_A == $_value['a'] && $_GET['s'] == $_s ? 'class="on"' : '';

}

if($_value['parentid'] == 0 || $_value['m']=='') continue;

if($classname) {

$string .= "<a href='javascript:;' $classname><em>".L($_value['name'])."</em></a><span>|</span>";

} else {

$string .= "<a href='?m=".$_value['m']."&c=".$_value['c']."&a=".$_value['a']."&menuid=$parentid&pc_hash=$pc_hash".'&'.$_value['data']."' $classname><em>".L($_value['name'])."</em></a><span>|</span>";

}

}

$string = substr($string,0,-14);

return $string;

}

/**

* 当前位置

*

* @param $id 菜单id

*/

//利用递归,获取某一个menu的所有父菜单层级,作为HTML片段返回

final public static function current_pos($id) {

$menudb = pc_base::load_model('menu_model');

$r =$menudb->get_one(array('id'=>$id),'id,name,parentid');

$str = '';

if($r['parentid']) {

$str = self::current_pos($r['parentid']);

}

return $str.L($r['name']).' > ';

}

/**

* 获取当前的站点ID

*/

final public static function get_siteid() {

return get_siteid();

}

/**

*

* 获取当前站点信息

* @param integer $siteid 站点ID号,为空时取当前站点的信息

* @return array

* 登录时获取网站界面

*/

final public static function get_siteinfo($siteid = '') {

if ($siteid == '') $siteid = self::get_siteid();

if (empty($siteid)) return false;

$sites = pc_base::load_app_class('sites', 'admin');

return $sites->get_by_id($siteid);

}

final public static function return_siteid() {

$sites = pc_base::load_app_class('sites', 'admin');

$siteid = explode(',',$sites->get_role_siteid($_SESSION['roleid']));

return current($siteid);

}

/**

* 权限判断

*/

//检查用户是否正在访问m、c、a、的操作权限

final public function check_priv() {

//登录界面:一旦返回true,将终止后续代码的执行

if(ROUTE_M =='admin' && ROUTE_C =='index' && in_array(ROUTE_A, array('login', 'init', 'public_card'))) return true;

//roleid:1 超级管理员,一旦返回true,将终止后面代码的执行

if($_SESSION['roleid'] == 1) return true;

$siteid = param::get_cookie('siteid'); //站点id

$action = ROUTE_A; //方法

$privdb = pc_base::load_model('admin_role_priv_model');

if(preg_match('/^public_/',ROUTE_A)) return true; //如果以public_开头的方法

if(preg_match('/^ajax_([a-z]+)_/',ROUTE_A,$_match)) { //以ajax_开头的方法,则只截取后半部分作为查询条件

$action = $_match[1]; //匹配结果

}

//尝试获取有无m、a、roleid siteid都复合的权限记录

$r =$privdb->get_one(array('m'=>ROUTE_M,'c'=>ROUTE_C,'a'=>$action,'roleid'=>$_SESSION['roleid'],'siteid'=>$siteid));

if(!$r) showmessage('您没有权限操作该项','blank');

}

/**

*

* 记录日志

*/

final private function manage_log() {

//判断是否记录

$setconfig = pc_base::load_config('system');

extract($setconfig);

if($admin_log==1){ //是否记录后台操作日志

$action = ROUTE_A; //方法

if($action == '' || strchr($action,'public') || $action == 'init' || $action=='public_current_pos') {

return false; //以上几种方法除外

}else {

$ip = ip();

$log = pc_base::load_model('log_model');//数据表

$username = param::get_cookie('admin_username');//用户名

$userid = isset($_SESSION['userid']) ? $_SESSION['userid'] : '';//用户id

$time = date('Y-m-d H-i-s',SYS_TIME); //系统时间

$url = '?m='.ROUTE_M.'&c='.ROUTE_C.'&a='.ROUTE_A; //操作地址

$log->insert(array('module'=>ROUTE_M,'username'=>$username,'userid'=>$userid,'action'=>ROUTE_C, 'querystring'=>$url,'time'=>$time,'ip'=>$ip)); //记录操作日志入库

}

}

}

/**

*

* 后台IP禁止判断 ...

*/

final private function check_ip(){

$this->ipbanned = pc_base::load_model('ipbanned_model');

$this->ipbanned->check_ip();

}

/**

* 检查锁屏状态

*/

final private function lock_screen() {

if(isset($_SESSION['lock_screen']) && $_SESSION['lock_screen']==1) {

if(preg_match('/^public_/', ROUTE_A) || (ROUTE_M == 'content' && ROUTE_C == 'create_html') || (ROUTE_M == 'release') || (ROUTE_A == 'login') || (ROUTE_M == 'search' && ROUTE_C == 'search_admin' && ROUTE_A=='createindex')) return true;

showmessage(L('admin_login'),'?m=admin&c=index&a=login');

}

}

/**

* 检查hash值,验证用户数据安全性

*/

final private function check_hash() {

//如果是公有方法、管理首页、登陆界面等不需要hash认证的,予以放行

if(preg_match('/^public_/', ROUTE_A) || ROUTE_M =='admin' && ROUTE_C =='index' || in_array(ROUTE_A, array('login'))) {

return true;

}

//不管是GET还是POST来的pc_hash,如果能和服务端pc_hash对应的上,则pass

if(isset($_GET['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_GET['pc_hash'])) {

return true;

} elseif(isset($_POST['pc_hash']) && $_SESSION['pc_hash'] != '' && ($_SESSION['pc_hash'] == $_POST['pc_hash'])) {

return true;

} else {

showmessage(L('hash_check_false'),HTTP_REFERER);

}

}

/**

* 后台信息列表模板

* @param string $id 被选中的模板名称

* @param string $str form表单中的属性名

*/


final public function admin_list_template($id = '', $str = '') {

$templatedir = PC_PATH.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.'content'.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR;

$pre = 'content_list';

$templates = glob($templatedir.$pre.'*.tpl.php');

if(empty($templates)) return false;

$files = @array_map('basename', $templates);

$templates = array();

if(is_array($files)) {

foreach($files as $file) {

$key = substr($file, 0, -8);

$templates[$key] = $file;

}

}

ksort($templates);

return form::select($templates, $id, $str,L('please_select'));

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: