CheckPermission.php 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Auth;
  6. use App\Models\Permission;
  7. use App\Services\UserTypePermissionService;
  8. class CheckPermission
  9. {
  10. public function __construct(
  11. protected UserTypePermissionService $service
  12. ) {}
  13. public function handle(Request $request, Closure $next, string $scopes, string $permissionType)
  14. {
  15. $user = Auth::user();
  16. if (!$user) {
  17. if ($this->checkGuest($scopes, $permissionType)) {
  18. return $next($request);
  19. }
  20. return response()->json(['message' => 'Unauthorized'], 401);
  21. }
  22. foreach (explode('|', $scopes) as $scope) {
  23. if ($user->hasPermission($scope, $permissionType)) {
  24. return $next($request);
  25. }
  26. }
  27. return response()->json(['message' => 'Forbidden', 'code' => 403], 403);
  28. }
  29. protected function checkGuest(string $scopes, string $permissionType): bool
  30. {
  31. $requiredBit = Permission::getBit($permissionType);
  32. $permissions = $this->service->allGuestPermissions();
  33. foreach (explode('|', $scopes) as $scope) {
  34. $perm = $permissions->first(fn($p) => $p->permission->scope === $scope);
  35. if ($perm && ($perm->bits & $requiredBit)) return true;
  36. }
  37. return false;
  38. }
  39. }