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 gunakanuser
,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_USER
→403 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.