
//权限认证的过滤器方法
static public function AccessDecision($appName=APP_NAME)
{
//检查是否需要认证
if(RBAC::checkAccess()) {
//存在认证识别号,则进行进一步的访问决策
$accessGuid = md5($appName.MODULE_NAME.ACTION_NAME);
if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
if(C('USER_AUTH_TYPE')==2) {
//加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
//通过数据库进行访问检查
$accessList = RBAC::getAccessList($_SESSION[C('USER_AUTH_KEY')]);
}else {
// 如果是管理员或者当前操作已经认证过,无需再次认证
if( $_SESSION[$accessGuid]) {
return true;
}
//登录验证模式,比较登录后保存的权限访问列表
$accessList = $_SESSION['_ACCESS_LIST'];
}
//判断是否为组件化模式,如果是,验证其全模块名
$module = defined('P_MODULE_NAME')? P_MODULE_NAME : MODULE_NAME;
/*
* 若模块节点下未设置操作节点,默认为具有全部操作权限
* 相当于仅验证至模块节点,不再继续验证操作节点
* modify by jxxysong 2011-12-10
*/
$db = Db::getInstance();
$table = C('RBAC_NODE_TABLE');
$sql = "SELECT id, name
FROM ".$table."
WHERE pid = (
SELECT id
FROM xp_node
WHERE name = '{$module}'
AND STATUS =1
AND LEVEL =2 )
AND STATUS =1
AND LEVEL =3 ";
$nodes = $db->query($sql);
if (count($nodes)>0){
$listAccess = $accessList[strtoupper($appName)][strtoupper($module)][strtoupper(ACTION_NAME)];
}else{
$listAccess = $accessList[strtoupper($appName)][strtoupper($module)];
}
/* end modify */
if(!isset($listAccess)) {
$_SESSION[$accessGuid] = false;
return false;
}
else {
$_SESSION[$accessGuid] = true;
}
}else{
//管理员无需认证
return true;
}
}
return true;
}