| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- <?php
- namespace App\Http\Middleware;
- use Closure;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- /**
- * 运营配置类接口(维护、支付配置、APP 配置、分享赚钱、报表设置与对账、模拟数据重置等)的准入。
- *
- * 超级管理员(ID 1)直接放行。其他管理员只查数据库角色,不用环境变量白名单:
- * 1. 角色勾选了这个接口的按钮 URI(路由 defaults 的 permission_uri,没有则为路由 URI,同 CheckButtonPermission)→ 放行;
- * 2. 这个按钮在菜单里已经建了但角色没勾 → 拒绝;
- * 3. 按钮还没建时,角色勾选了同一模块的任意按钮(admin/<模块> 或 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();
- }
- }
|