Lewati ke konten utama

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.