CheckButtonPermission.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Models\Menu;
  4. use App\Services\MenuService;
  5. use App\Services\RoleService;
  6. use App\Services\RoleUserService;
  7. use Closure;
  8. use Illuminate\Http\JsonResponse;
  9. use Illuminate\Http\Request;
  10. class CheckButtonPermission
  11. {
  12. public function handle(Request $request, Closure $next)
  13. {
  14. $user = $request->user;
  15. $userId = $user->id;
  16. if($userId == 1){
  17. return $next($request);
  18. }
  19. $roleUserList = RoleUserService::findAll(['user_id' => $userId]);
  20. $roleIds = collect($roleUserList)->pluck('role_id')->toArray();
  21. $route = $request->route();
  22. $currentUri = $route->defaults['permission_uri'] ?? ltrim($route->uri(), '/');
  23. $lotteryPermission = $route->defaults['lottery_odds_permission'] ?? null;
  24. $requiresActiveButton = $lotteryPermission === 'write' || ($route->defaults['require_active_button'] ?? false);
  25. if ($lotteryPermission !== null) {
  26. $currentUri = match ($request->input('game')) {
  27. 'lhc' => $lotteryPermission === 'read' ? 'admin/lhcNumber/list' : 'admin/lhcNumber/setOdds',
  28. 'canada28', 'jisu28' => $lotteryPermission === 'read' ? 'admin/gameplayRule' : 'admin/gameplayRule/submit',
  29. 'jisu', null => $lotteryPermission === 'read' ? 'admin/jisuGame/list' : 'admin/jisuGame/setOdds',
  30. default => $lotteryPermission === 'read' ? 'admin/jisuGame/list' : null,
  31. };
  32. }
  33. if ($currentUri === null) {
  34. return $this->denied();
  35. }
  36. if (!$requiresActiveButton) {
  37. $menu = MenuService::findOne(['uri' => $currentUri, 'type' => Menu::TYPE_BUTTON, 'status' => Menu::STATUS_SHOW]);
  38. if (!$menu) {
  39. return $next($request);
  40. }
  41. }
  42. $roles = RoleService::model()::with(['menus' => function ($query) use ($requiresActiveButton) {
  43. $query->where('type', Menu::TYPE_BUTTON);
  44. if ($requiresActiveButton) {
  45. $query->where('status', Menu::STATUS_SHOW);
  46. }
  47. }])->whereIn('id', $roleIds)->get();
  48. foreach ($roles as $role) {
  49. if (in_array($currentUri, $role->menus_uris, $requiresActiveButton)) {
  50. return $next($request);
  51. }
  52. }
  53. return $this->denied();
  54. }
  55. private function denied(): JsonResponse
  56. {
  57. return response()->json([
  58. 'code' => -1,
  59. 'timestamp' => time(),
  60. 'msg' => '无权限访问',
  61. 'data' => [],
  62. ]);
  63. }
  64. }