Lewati ke konten utama

Roles & Security di API Platform

API Platform terintegrasi erat dengan sistem keamanan Symfony. Salah satu mekanisme kontrol akses yang paling umum adalah berdasarkan roles.


1. Apa Itu Role?

Role adalah label akses yang diberikan kepada user, seperti:

  • ROLE_USER
  • ROLE_ADMIN
  • ROLE_SUPER_ADMIN

Role bisa digunakan untuk membatasi akses ke resource API secara global maupun per operasi (GET, POST, PUT, dll).


2. Menambahkan Role ke User

Misalnya, entitas User memiliki property roles:

#[ORM\Column(type: 'json')]
private array $roles = [];

public function getRoles(): array
{
$roles = $this->roles;
$roles[] = 'ROLE_USER';

return array_unique($roles);
}

3. Membatasi Akses Global di Resource

Gunakan properti security pada ApiResource untuk membatasi seluruh resource:

use ApiPlatform\Metadata\ApiResource;

#[ApiResource(
security: "is_granted('ROLE_ADMIN')"
)]
class Product
{
// ...
}

4. Membatasi Akses Per Operasi

use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\Post;
use ApiPlatform\Metadata\Put;
use ApiPlatform\Metadata\ApiResource;

#[ApiResource(
operations: [
new Get(security: "is_granted('ROLE_USER')"),
new Post(security: "is_granted('ROLE_ADMIN')"),
new Put(security: "object.getOwner() == user")
]
)]
class Article
{
// ...
}

🔐 Kamu bisa membatasi operasi berdasarkan role, user yang sedang login, atau bahkan properti dari objek.

5. Menyembunyikan Data di Response Berdasarkan Role

Gunakan Serialization Groups:

#[Groups(['user:read'])]
#[Groups(['admin:read'])]

Dan kombinasikan dengan normalizationContext + securityPostDenormalize jika perlu.

6. Menolak Akses Dengan Custom Pesan

#[ApiResource(
security: "is_granted('ROLE_ADMIN')",
securityMessage: "Hanya admin yang bisa mengakses data ini."
)]

7. Role di Controller atau Listener

Jika kamu pakai custom controller:

public function __invoke(Request $request)
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
}

8. Menambahkan Role Saat Registrasi

Contoh di controller registrasi:

$user->setRoles(['ROLE_USER']);

Atau secara dinamis:

if ($isCompany) {
$user->setRoles(['ROLE_COMPANY']);
}

9. Tools Tambahan

  • is_granted() → untuk cek satu role

  • security expression → bisa gunakan user, object, has_role(), user == object.getOwner(), dll.

  • security_post_denormalize → untuk validasi setelah data diisi

10. Contoh Endpoint

POST /api/products

  • ROLE_ADMIN → berhasil

  • ROLE_USER403 Forbidden

GET /api/products

  • ROLE_USER → berhasil

  • anonymous → 401 Unauthorized

Kesimpulan ✅ Gunakan is_granted() untuk pembatasan role ✅ Gunakan security di level resource atau operasi ✅ Gunakan serialization groups untuk pengendalian tampilan data ✅ Role bisa dikombinasikan dengan objek dan ekspresi lanjutan

🛡️ Dengan security berbasis role, API kamu jadi lebih aman, terstruktur, dan fleksibel.