CheckPermission.php 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Http\Resources\UserTypePermissionResource;
  4. use Closure;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use App\Services\UserTypePermissionService;
  8. use Illuminate\Support\Facades\Log;
  9. class CheckPermission
  10. {
  11. public function __construct(
  12. protected UserTypePermissionService $userTypePermissionService,
  13. ) {}
  14. /**
  15. * Handle an incoming request.
  16. *
  17. * @param \Illuminate\Http\Request $request
  18. * @param \Closure $next
  19. * @param string $scopes A string of scopes separated by '|' to check a single permission against.
  20. * @param string $permissionType The type of permission to check for each scope.
  21. * @return \Symfony\Component\HttpFoundation\Response
  22. */
  23. public function handle(Request $request, Closure $next, string $scopes, string $permissionType)
  24. {
  25. $user = Auth::user();
  26. $userPermissions = [];
  27. $userPermissions = $user
  28. ? $this->userTypePermissionService->allPermissionsByUserType($user->type)
  29. : $this->userTypePermissionService->allGuestPermissions();
  30. $hasPermission = false;
  31. foreach (explode(separator: '|', string: $scopes) as $scope) {
  32. Log::info(message: "Checking permission for scope: $scope, permission type: $permissionType");
  33. if ($this->hasPermission(userPermissions: $userPermissions, scope: $scope, permissionType: $permissionType)) {
  34. $hasPermission = true;
  35. break;
  36. }
  37. }
  38. if (!$hasPermission) {
  39. return response()->json(data: ['message' => 'Unauthorized'], status: 403);
  40. }
  41. return $next($request);
  42. }
  43. private function hasPermission($userPermissions, string $scope, string $permissionType): bool
  44. {
  45. $bitwisePermissionTable = [
  46. 'view' => 1,
  47. 'add' => 2,
  48. 'edit' => 4,
  49. 'delete' => 8,
  50. 'print' => 16,
  51. 'export' => 32,
  52. 'import' => 64,
  53. 'limit' => 128,
  54. 'menu' => 256,
  55. ];
  56. $requiredPermission = $bitwisePermissionTable[$permissionType] ?? 0;
  57. Log::info('required permission');
  58. Log::info($requiredPermission);
  59. Log::info('user permissions');
  60. Log::info($userPermissions);
  61. $permissionRecord = $userPermissions->first(function ($permission) use ($scope) {
  62. return $permission->permission->scope === $scope;
  63. });
  64. Log::info('permission record');
  65. Log::info($permissionRecord);
  66. if (!$permissionRecord) {
  67. return false;
  68. }
  69. return ($permissionRecord->bits & $requiredPermission) === $requiredPermission;
  70. }
  71. }