| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- <?php
- namespace App\Http\Middleware;
- use App\Models\Menu;
- use App\Services\MenuService;
- use App\Services\RoleService;
- use App\Services\RoleUserService;
- use Closure;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Http\Request;
- class CheckButtonPermission
- {
- public function handle(Request $request, Closure $next)
- {
- $user = $request->user;
- $userId = $user->id;
- if($userId == 1){
- return $next($request);
- }
- $roleUserList = RoleUserService::findAll(['user_id' => $userId]);
- $roleIds = collect($roleUserList)->pluck('role_id')->toArray();
- $route = $request->route();
- $currentUri = $route->defaults['permission_uri'] ?? ltrim($route->uri(), '/');
- $lotteryPermission = $route->defaults['lottery_odds_permission'] ?? null;
- $requiresActiveButton = $lotteryPermission === 'write' || ($route->defaults['require_active_button'] ?? false);
- if ($lotteryPermission !== null) {
- $currentUri = match ($request->input('game')) {
- 'lhc' => $lotteryPermission === 'read' ? 'admin/lhcNumber/list' : 'admin/lhcNumber/setOdds',
- 'canada28', 'jisu28' => $lotteryPermission === 'read' ? 'admin/gameplayRule' : 'admin/gameplayRule/submit',
- 'jisu', null => $lotteryPermission === 'read' ? 'admin/jisuGame/list' : 'admin/jisuGame/setOdds',
- default => $lotteryPermission === 'read' ? 'admin/jisuGame/list' : null,
- };
- }
- if ($currentUri === null) {
- return $this->denied();
- }
- if (!$requiresActiveButton) {
- $menu = MenuService::findOne(['uri' => $currentUri, 'type' => Menu::TYPE_BUTTON, 'status' => Menu::STATUS_SHOW]);
- if (!$menu) {
- return $next($request);
- }
- }
- $roles = RoleService::model()::with(['menus' => function ($query) use ($requiresActiveButton) {
- $query->where('type', Menu::TYPE_BUTTON);
- if ($requiresActiveButton) {
- $query->where('status', Menu::STATUS_SHOW);
- }
- }])->whereIn('id', $roleIds)->get();
- foreach ($roles as $role) {
- if (in_array($currentUri, $role->menus_uris, $requiresActiveButton)) {
- return $next($request);
- }
- }
- return $this->denied();
- }
- private function denied(): JsonResponse
- {
- return response()->json([
- 'code' => -1,
- 'timestamp' => time(),
- 'msg' => '无权限访问',
- 'data' => [],
- ]);
- }
- }
|