Lewati ke konten utama

Autentikasi & Validasi Saat PUT di API Platform

Operasi PUT digunakan untuk mengupdate resource secara penuh. Dalam API Platform, kita dapat mengatur agar hanya user tertentu yang dapat melakukan PUT, serta memvalidasi field tertentu hanya saat update.


1. Autentikasi & Akses PUT

Gunakan properti security di dalam operasi PUT untuk membatasi akses hanya kepada user yang berwenang (misalnya pemilik data atau admin):

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Put;

#[ApiResource(
operations: [
new Put(
security: "is_granted('ROLE_USER') and object.getUser() == user",
validationContext: ['groups' => ['update']]
)
]
)]
class Comment
{
// ...
}

🔐 Di atas, hanya user yang membuat Comment yang bisa melakukan update.

2. Validasi Kustom untuk PUT

Gunakan Validation Groups agar validasi hanya berlaku saat PUT:

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\Groups;

#[Groups(['update'])]
#[Assert\Length(min: 10, groups: ['update'])]
private ?string $content = null;

3. Menghindari Update oleh User Lain

Walau security sudah diterapkan di operasi, kamu tetap bisa membuat proteksi ekstra dengan security_post_denormalize:

new Put(
securityPostDenormalize: "is_granted('ROLE_USER') and object.getUser() == user"
)

🛡️ Ini memastikan hanya owner yang bisa update — bahkan jika ada manipulasi field user dalam payload.

4. Contoh Request PUT

PUT /api/comments/10
Authorization: Bearer <jwt_token>
Content-Type: application/json

Payload:

{
"content": "Ini versi update dari komentar saya."
}

5. Response PUT

Jika sukses:

{
"@context": "/api/contexts/Comment",
"@id": "/api/comments/10",
"content": "Ini versi update dari komentar saya."
}

Jika gagal (validasi):

{
"@context": "/api/contexts/ConstraintViolationList",
"@type": "ConstraintViolationList",
"violations": [
{
"propertyPath": "content",
"message": "This value is too short. It should have 10 characters or more."
}
]
}

6. Menggunakan curl untuk PUT

curl -X PUT https://localhost/api/comments/10 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <JWT_TOKEN>" \
-d '{"content": "Updated comment content"}'

7. Tips Penting

  • Gunakan security dan security_post_denormalize bersamaan untuk keamanan maksimal.

  • Jangan biarkan field user bisa ditimpa via PUT — hindari @Groups(["put"]) untuk field sensitif.

  • Gunakan validation groups agar field tertentu hanya divalidasi saat PUT.

Kesimpulan ✅ Autentikasi menggunakan security dan validasi berbasis role ✅ Validation Groups memungkinkan validasi dinamis berdasarkan operasi ✅ Proteksi PUT penting untuk mencegah perubahan data sensitif oleh user lain

🔐 Pastikan hanya pemilik yang bisa melakukan PUT, dan validasi data tetap kuat untuk menjaga integritas sistem.