/** * 生成菜单 * 从配置文件中取出菜单的数组 * 查看这个数组是否存在childs元素 * 如果存在childs元素则用这个数组与当前用户允许的访问的模块和操作进行匹配 * 如果匹配到了就把其放入menu数组中去 * 如果不存在childs则根据link来切割获取module和action * 并判断其是否在允许访问的列表中,如果在则将其允许访问的标志放入menu中去 */ protected function menu() { $a = $_SESSION; if (isset($_SESSION[C('USER_AUTH_KEY')])) { // 显示菜单项 $menu = array(); if (isset($_SESSION['menu1' . $_SESSION[C('USER_AUTH_KEY')]])) { // 如果已经缓存,直接读取缓存 // $menu = $_SESSION['menu' . $_SESSION[C('USER_AUTH_KEY')]]; } else { $list = C('MENU'); if (isset($_SESSION['_ACCESS_LIST'])) { // $accessList = $_SESSION['_ACCESS_LIST']; $accessList = Rbac::getAccessList($_SESSION[C('USER_AUTH_KEY')]); } else { $accessList = Rbac::getAccessList($_SESSION[C('USER_AUTH_KEY')]); } // var_dump($accessList);exit(); $menu = $this->get_menu($list, $accessList); // $_SESSION['menu' . $_SESSION[C('USER_AUTH_KEY')]] = $menu; } // var_dump($menu);exit(); $this->assign('menu', $menu); } }
/** * @param string $access * @return bool */ function check_access($access = "") { $path = explode('/', strtoupper($access)); $accessList = \Org\Util\Rbac::getAccessList($_SESSION[get_opinion('USER_AUTH_KEY')]); if ((int) $_SESSION[get_opinion('USER_AUTH_KEY')] == 1 || $accessList[$path[0]][$path[1]][$path[2]] != '') { return true; } else { return false; } }
/** * 得到菜单 * @return array */ protected function getMenu() { $menu = C('MENU'); // 主菜单 $mainMenu = array(); // 已被映射过的键值 $mapped = array(); // 访问权限 $access = $_SESSION['_ACCESS_LIST']; if (empty($access)) { $authId = $_SESSION[C('USER_AUTH_KEY')]; $access = \Org\Util\Rbac::getAccessList($authId); } $authGroup = strtoupper(C('GROUP_AUTH_NAME')); // 处理主菜单 foreach ($menu as $key => $menuItem) { // 不显示无权限访问的主菜单 if (!$_SESSION[C('ADMIN_AUTH_KEY')] && !array_key_exists(strtoupper($key), $access[$authGroup])) { continue; } // 主菜单是否存在映射 if (isset($menuItem['mapping'])) { // 映射名 $mapping = $menuItem['mapping']; // 新的菜单键值 if (!empty($mapped[$mapping])) { $key = "{$mapped[$mapping]}-{$key}"; $mapping = $mapped[$mapping]; } else { $key = "{$mapping}-{$key}"; } // 需要映射的键值已存在,则删除 if (isset($mainMenu[$mapping])) { $mainMenu[$key]['name'] = $mainMenu[$mapping]['name']; $mainMenu[$key]['target'] = $mainMenu[$mapping]['target']; unset($mainMenu[$mapping]); $mapped[$mapping] = $key; } continue; } $mainMenu[$key]['name'] = $menuItem['name']; $mainMenu[$key]['target'] = $menuItem['target']; //如果默认的target用户无权访问,则显示sub_menu中的用户有权访问的第一个页面 $actions = $access[$authGroup][strtoupper($key)]; $action = explode('/', strtoupper($mainMenu[$key]['target'])); while (!$_SESSION[C('ADMIN_AUTH_KEY')] && !array_key_exists($action[1], $actions)) { $nextSubMenu = next($menu[$key]['sub_menu']); if (empty($nextSubMenu)) { break; } $mainMenu[$key]['target'] = key(current($nextSubMenu)); $action = explode('/', strtoupper($mainMenu[$key]['target'])); } } // 子菜单 $subMenu = array(); $ctrlName = CONTROLLER_NAME; if (isset($menu[$ctrlName]['mapping'])) { $ctrlName = $menu[$ctrlName]['mapping']; } $actions = $access[$authGroup]; // 主菜单如果为隐藏,则子菜单也不被显示 foreach ($menu[$ctrlName]['sub_menu'] as $item) { // 子菜单是否需要显示 if (isset($item['hidden']) && true === $item['hidden']) { continue; } $route = array_shift(array_keys($item['item'])); $action = explode('/', strtoupper($route)); // 不显示无权限访问的子菜单 if (!$_SESSION[C('ADMIN_AUTH_KEY')] && (!array_key_exists($action[0], $actions) || !array_key_exists($action[1], $actions[$action[0]]))) { continue; } // 子菜单是否有配置 if (!isset($item['item']) || empty($item['item'])) { continue; } $routes = array_keys($item['item']); $itemNames = array_values($item['item']); $subMenu[$routes[0]] = $itemNames[0]; } unset($menu); return array('main_menu' => $mainMenu, 'sub_menu' => $subMenu); }