CheckPermission.php 2.3 KB

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