Skip to content

refactor(serializer): move isCacheKeySafe to AbstractItemNormalizer#8200

Open
soyuka wants to merge 3 commits into
api-platform:4.3from
soyuka:fix/cache-key-security-jsonapi-hal
Open

refactor(serializer): move isCacheKeySafe to AbstractItemNormalizer#8200
soyuka wants to merge 3 commits into
api-platform:4.3from
soyuka:fix/cache-key-security-jsonapi-hal

Conversation

@soyuka
Copy link
Copy Markdown
Member

@soyuka soyuka commented May 25, 2026

Internal refactor moving the cache-key safety check to the base normalizer so it is shared across formats. Adds unit-test coverage.

Holding for review.

soyuka added 3 commits May 25, 2026 17:24
`#[ApiProperty(security: ...)]` makes allowed attributes per-user, but the
local `componentsCache` in JsonApi and Hal item normalizers is not
user-aware: a cached component map can leak attributes across users.

Move `isCacheKeySafe()` from `GraphQl/Serializer/ItemNormalizer` into
`Serializer/AbstractItemNormalizer` so it is shared across all formats,
and gate `$context['cache_key']` with it in JsonApi and Hal. Promote
`CacheKeyTrait::getCacheKey()` from `private` to `protected` so
subclasses can reuse the inherited trait method.

Supersedes api-platform#7854.
- Bump api-platform/serializer min to ^4.3.7 in JsonApi, Hal and GraphQl
  composer.json so they pull a serializer release that exposes the new
  protected isCacheKeySafe() method on AbstractItemNormalizer.
- Change createCacheKeySafeProbe() return type to object so PHPStan can
  resolve probeIsCacheKeySafe() on the anonymous AbstractItemNormalizer
  subclass.
@soyuka soyuka changed the title fix(serializer): gate cache_key in JsonApi and Hal with isCacheKeySafe refactor(serializer): move isCacheKeySafe to AbstractItemNormalizer May 27, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant