<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Arr; class Permission { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $isApi = $request->ajax(); $user = $request->user; //处理权限和菜单 $permData = config('perm.perm'); $action = $request->route('key'); empty($action) && $action = 'Dashboard'; //获取菜单 if (!$isApi && empty($request->input('window'))) { $menuData = json_decode(curl($permData['menu_url'] . $permData['menu_id'])); if (empty($menuData->data)) { return '菜单生成错误,请联系技术'; } else { $menuData = $menuData->data; } $menus = !in_array($request->user->userId, $permData['admin_group']) ? $this->menu($menuData, $request->user->userId) : $menuData; if (empty($menus)) { return $this->view('Auth', '没有访问权限', $permData['go_url']); } $request->menus = $menus; } if (!in_array($user->userId, $permData['admin_group']) && $action != 'Dashboard') {//不是超级管理员 $perm = $this->perm($request->user->userId, $action); if ($perm !== true) { if ($isApi) { return '没有权限'; } return $this->view('Auth', '没有访问权限', $permData['go_url']); } } return $next($request, $action); } //去菜单里面提取路由方法(用于权限对比) private function getMenuPerms($menuData) { $perms = []; foreach ($menuData as $k => $v) { $v = (array)$v; $permChild = []; $perm = []; if (strlen($v['href']) > 2) { $action = explode('/', $v['href']); $perm[] = end($action); } if (count($v['childs']) > 0) { $permChild = $this->getMenuPerms($v['childs']); } $perms = array_merge($perms, array_merge($perm, $permChild)); } return $perms; } //根据权限生成菜单 private function menu($menu, $user) { $perm = $this->getMenuPerms($menu); $perm1 = implode(',', $perm); $permArr = config('perm.perm'); $perm = $permArr['id']; $url = $permArr['url'] . '/' . $user . '/' . $perm . '?perms=' . $perm1; $result = json_decode(curl($url, '', false), true); if ($result['retcode'] === 0) { $find = $result['data']['perms']; $menu = $this->deleteMenu($menu, $find); if (!empty($menu) && is_array($menu)) { foreach ($menu as $k => $v) { $v = (array)$v; if ($v['title'] != 'Dashboard' && count($v['childs']) == 0 && empty($v['href'])) { unset($menu[$k]); } } } return array_merge($menu); } else { return false; } } //删除没有权限的菜单 function deleteMenu($menu, $find) { foreach ($menu as $k => $v) { if (strlen($v->href) > 2) { $action = explode('/', $v->href); $key = end($action); if (empty($find[$key]) || $find[$key] == false) { unset($menu[$k]); } } else { if (count($v->childs) > 0) { $menu[$k]->childs = array_values($this->deleteMenu($v->childs, $find)); } if (!count($v->childs) > 0 && $v->title != '首页') { unset($menu[$k]); }//为了删除没有下级的目录 } } return array_values($menu); } private function view($errcode, $errinfo, $goUrl = '') { $data = [ 'errcode' => $errcode, 'errinfo' => $errinfo, 'url' => $goUrl ]; return view('errors.error', $data); } //检查权限,仅支持验证单个权限 function perm($userId, $perm1 = '') { $permArr = config('perm.perm'); $NotAuth = $permArr['notAuth']; $AdminID = $permArr['adminGroup']; if ((!in_array($perm1, $NotAuth)) && !in_array($userId, $AdminID)) {//过滤不用鉴权的方法与用户 $permID = $permArr['id']; $url = $permArr['url'] . '/' . $userId . '/' . $permID . '?perms=' . $perm1; $result = json_decode(curl($url, '', 0), true); if (!isset($result['retcode']) || $result['retcode'] !== 0 || $result['data']['perms'][$perm1] == false) { return false; } else { return true; } } else { return true; } } }