Auth & Validasi Saat POST di API Platform
Saat membuat endpoint POST
di API Platform, kita sering membutuhkan:
✅ Autentikasi (hanya user login yang boleh POST)
✅ Validasi (pastikan data valid sebelum disimpan)
✅ Akses terbatas per user (misalnya, hanya owner yang boleh menambahkan)
Dokumentasi ini membahas langkah-langkah lengkap untuk mengatur autentikasi dan validasi khusus pada operasi POST
.
1. Autentikasi via JWT
Pastikan API kamu sudah menggunakan JWT (lihat dokumentasi JWT
).
Di entity yang ingin diamankan, kamu bisa menggunakan properti security
pada operasi POST
.
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Post;
#[ApiResource(
operations: [
new Post(
security: "is_granted('ROLE_USER')",
validationContext: ['groups' => ['create']]
)
]
)]
class Comment
{
// ...
}
🔒 Hanya user dengan ROLE_USER yang bisa mengakses endpoint POST /api/comments.
2. Validasi Kustom di Operasi POST
Misalnya, kita hanya ingin validasi tertentu berlaku saat POST, gunakan validation groups:
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\Groups;
#[Groups(['create'])]
#[Assert\NotBlank(groups: ['create'])]
private ?string $content = null;
3. Set Owner Secara Otomatis
Biasanya, kita tidak ingin frontend mengatur siapa owner dari data, jadi kita set secara otomatis:
use Symfony\Component\Security\Core\Security;
class CommentDataPersister implements ContextAwareDataPersisterInterface
{
public function __construct(
private Security $security,
private EntityManagerInterface $em
) {}
public function supports($data, array $context = []): bool
{
return $data instanceof Comment;
}
public function persist($data, array $context = []): object
{
if ($data instanceof Comment && !$data->getId()) {
$data->setUser($this->security->getUser());
}
$this->em->persist($data);
$this->em->flush();
return $data;
}
public function remove($data, array $context = []): void
{
$this->em->remove($data);
$this->em->flush();
}
}
Jangan lupa daftarkan service-nya.
4. Contoh Alur POST
Request:
{
"content": "Ini komentar saya",
"user": "/api/users/1" // ← akan diabaikan
}
Response (sukses):
{
"@context": "/api/contexts/Comment",
"@id": "/api/comments/10",
"content": "Ini komentar saya",
"user": "/api/users/5" // ← otomatis di-set oleh backend
}
5. Validasi Response Jika Gagal
Contoh jika content kosong:
{
"@context": "/api/contexts/ConstraintViolationList",
"@type": "ConstraintViolationList",
"hydra:title": "An error occurred",
"violations": [
{
"propertyPath": "content",
"message": "This value should not be blank."
}
]
}
6. Uji Endpoint POST (curl)
curl -X POST https://localhost/api/comments \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{"content": "Isi komentar"}'
Kesimpulan
✅ Gunakan security
di operasi POST
untuk mengatur hak akses
✅ Gunakan validationContext
untuk validasi khusus saat POST
✅ Hindari client menentukan data sensitif seperti owner
✅ Gunakan DataPersister
untuk logika sebelum simpan data
🛡️ Dengan kontrol penuh atas POST
, kamu bisa menjaga integritas & keamanan data lebih baik.