或 admin/<模块>/...,如 admin/maintenance/logs 属于 admin/maintenance)→ 放行。 * 所以没有单独建按钮的接口,跟随同模块的授权,不会因漏建按钮而对所有人开放,也不需要逐个建按钮。 */ class OperationsAdminMiddleware { private const SUPER_ADMIN_ID = 1; public function handle(Request $request, Closure $next) { $adminId = (int) ($request->user->id ?? 0); $route = $request->route(); $uri = $route ? ($route->defaults['permission_uri'] ?? ltrim($route->uri(), '/')) : ''; if (!self::allowed($adminId, $uri)) { return response()->json([ 'code' => -1, 'timestamp' => time(), 'msg' => '无运营配置管理权限', 'data' => [], ]); } return $next($request); } public static function allowed(int $adminId, string $uri): bool { if ($adminId <= 0) return false; if ($adminId === self::SUPER_ADMIN_ID) return true; if ($uri === '') return false; $granted = static fn () => DB::table('role_user as ru') ->join('role_menu as rm', 'rm.role_id', '=', 'ru.role_id') ->join('menus as m', 'm.id', '=', 'rm.menu_id') ->where('ru.user_id', $adminId); if ($granted()->where('m.uri', $uri)->exists()) return true; if (DB::table('menus')->where('uri', $uri)->exists()) return false; $module = implode('/', array_slice(explode('/', $uri), 0, 2)); return $granted()->where(static fn ($q) => $q->where('m.uri', $module)->orWhere('m.uri', 'like', $module . '/%'))->exists(); } }