<?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->fullUrlIs('*/api/*'); $user = $request->user; //处理权限和菜单 $permData = config('perm.perm'); $action = $request->route('key'); empty($action) && $action = 'Index'; //获取菜单 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)) { echo '没有访问权限'; } $request->menus = $menus; //获取权限放到头 $perms = $this->getPerms(); $request->perms = $perms; } if (!in_array($user->userId, $permData['admin_group']) && $action != 'Dashboard') {//不是超级管理员 $perm = $this->perm($request->user->userId, $action); if ($perm !== true) { if ($isApi) { return '没有权限'; } echo '没有访问权限'; } } 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, $perm = '') { $permArr = config('perm.perm'); $notAuth = $permArr['not_auth']; $AdminID = $permArr['admin_group']; if ((!in_array($perm, $notAuth)) && !in_array($userId, $AdminID)) {//过滤不用鉴权的方法与用户 $permID = $permArr['id']; $url = $permArr['url'] . '/' . $userId . '/' . $permID . '?perms=' . $perm; $result = json_decode(curl($url, '', 0), true); if (!isset($result['retcode']) || $result['retcode'] !== 0 || $result['data']['perms'][$perm] == false) { return false; } else { return true; } } else { return true; } } public function getPerms() { $userId = request()->user->userId; $permsUrl = config('perm.perm.list') . '/' . $userId . '/' . config('perm.perm.id') . '/'; $permsResult = json_decode(curl($permsUrl), true); $perms = []; if (isset($permsResult['retcode']) && $permsResult['retcode'] === 0) { $perms = $permsResult['data']['perms']; } return $perms; } }