CheckPermission.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Http\Resources\UserTypePermissionCollection;
  4. use Closure;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use App\Services\UserTypePermissionService;
  8. class CheckPermission
  9. {
  10. public function __construct(
  11. protected UserTypePermissionService $userTypePermissionService,
  12. ) {
  13. }
  14. /**
  15. * Handle an incoming request.
  16. *
  17. * @param \Illuminate\Http\Request $request
  18. * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
  19. * @param string $scope
  20. * @param string $permissionType
  21. * @return \Symfony\Component\HttpFoundation\Response
  22. */
  23. public function handle(Request $request, Closure $next, string $scope, string $permissionType)
  24. {
  25. $user = Auth::user();
  26. if (!$user) {
  27. $userPermissions = new UserTypePermissionCollection($this->userTypePermissionService->allGuestPermissions());
  28. } else {
  29. $userPermissions = new UserTypePermissionCollection($this->userTypePermissionService->allPermissionsByUserType($user->type));
  30. }
  31. if (!$this->hasPermission($userPermissions, $scope, $permissionType)) {
  32. return response()->json(['message' => 'Forbidden'], 403);
  33. }
  34. return $next($request);
  35. }
  36. private function hasPermission(UserTypePermissionCollection $userPermissions, string $scope, string $permissionType): bool
  37. {
  38. $bitwisePermissionTable = [
  39. 'view' => 1,
  40. 'add' => 2,
  41. 'edit' => 4,
  42. 'delete' => 8,
  43. 'print' => 16,
  44. 'export' => 32,
  45. 'import' => 64,
  46. 'limit' => 128,
  47. 'menu' => 256,
  48. ];
  49. $requiredPermission = $bitwisePermissionTable[$permissionType] ?? 0;
  50. foreach ($userPermissions as $permission) {
  51. if ($permission['scope'] === $scope && ($permission['bits'] & $requiredPermission)) {
  52. return true;
  53. }
  54. }
  55. return false;
  56. }
  57. }