예제 #1
0
 public static function AccessDecision($appName = APP_NAME)
 {
     //检查是否需要认证
     if (Arbac::checkAccess()) {
         //存在认证识别号,则进行进一步的访问决策
         $accessGuid = md5($appName . MODULE_NAME . ACTION_NAME);
         if (empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
             if (C('USER_AUTH_TYPE') == 2) {
                 //加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
                 //通过数据库进行访问检查
                 $accessList = Arbac::getAccessList($_SESSION[C('USER_AUTH_KEY')]);
                 $_SESSION['_ACCESS_LIST'] = $accessList;
             } else {
                 // 如果是管理员或者当前操作已经认证过,无需再次认证
                 if ($_SESSION[$accessGuid]) {
                     return true;
                 }
                 //登录验证模式,比较登录后保存的权限访问列表
                 $accessList = $_SESSION['_ACCESS_LIST'];
             }
             //判断是否为组件化模式,如果是,验证其全模块名
             $module = defined('P_MODULE_NAME') ? P_MODULE_NAME : MODULE_NAME;
             $auth_type = C("AUTH_TYPE");
             if (!isset($accessList[strtoupper($module)][strtoupper(ACTION_NAME)])) {
                 //进行相关模块或操作公共授权的判断
                 if (isset($accessList[$auth_type[2]][strtoupper(ACTION_NAME)])) {
                     $_SESSION[$accessGuid] = true;
                 } elseif (isset($accessList[strtoupper($module)][$auth_type[1]])) {
                     $_SESSION[$accessGuid] = true;
                 } else {
                     $_SESSION[$accessGuid] = false;
                     return false;
                 }
             } else {
                 $_SESSION[$accessGuid] = true;
             }
         } else {
             //管理员无需认证
             return true;
         }
     }
     return true;
 }