Perkenalan
Voters adalah fitur penting dari mekanisme otorisasi yang diterapkan pada Symfony. Voters memberikan kemampuan pada aplikasi Symfony untuk dapat melakukan pengecekan terhadap permission (misalnya: "Bisakah si user ini melakukan/mengakses ini?").
Tapi kadang-kadang saat logic security yang kita terapkan sangat komplek maka kita perlu tau dengan jelas kenapa sebuah permission diberikan. untuk itu Symfony profiler memiliki kemampuan untuk menunjukan beberapa detail tentang voters yang ada:

Akan tentapi informasi diatas tidaklah memberikan informasi yang cukup jelas. Sehingga mulai dari Symfony 4.2 pengembang Symfony melakukan peningkatan kemampuan pada panel profiler diatas untuk juga menampilakn informasi tentang keputusan yang diambil oleh Voters.

Penjelesan diatas diambil dari blog resmi milik Symfony disini.
Sebelumnya saya membuat catatan terkait Symfony Security Bundle disini, dan juga sedikit tambahan tentang bagaimana melakukan impersonating user pada catatatan ini, instalasi Symfony website skeleton dengan cepat disini, instalasi Api Platform disini, dan instalsi Symfony 4 dengan docker disini.
Sekedar mengingatkan bahwa isi dari blog ini adalah kebanyakan merupakan catatan pribadi saya, mungkin tidak begitu jelas atau lengkap untuk diikuti sebagai tutorial akan tetapi bila ada pertanyaan mengenai postingan saya maka saya akan senang hati untuk menjawab.
Authorization
Sebelum berbicara lebih jauh tentang voters maka kita harus memahami dulu konsep authorization yang ada pada Symfony 4 supaya terhindar dari kesesatan berfikir kebingungan yang berujung pada frustasi. Tips menggunakan Symfony adalah rajin membaca dokumentasi.
Access Decision Manager
Menentukan apakah user berhak atau tidak dalam melakukan aksi tertentu dapat menjadi sebuah proses yang sangat rumit, oleh karenanya maka AccessDecisionManager menggunakan beberapa voters dan membuat keputusan akhir berdasarkan semua votes (baik positif, negatif ataupun netral) yang diperoleh. AccessDecisionManager ini bekerja dengan beberapa strategi:
+Affirmative (default)
Beri akses bila ada satu saja voter yang memberikan akses.
+Consensus
Beri akses bila lebih banyak voters yang memberikan akses daripada yang menolak.
+Unanimous
Hanya beri akses bila semua voters memberi akses (tidak ada yang menolak satupun).
Contoh implementasi strategy pada security.yaml
Voters
Voter adalah instance dari VoterInterface, yang berarti kita harus mengimplementasikan beberapak methods yang diperlukan oleh decision manager.Symfony Security Component memiliki beberapa standar voters yang meng-cover beberapa kasus:
Contoh Implementasi
Pastikan sudah memiliki fitur user login dan crud sederhanya, misalnya simple post yang bisa melakukan crud sebuah blog post sederhana.security.yaml
Pada kasus ini kita akan menggunakan strategi unanimous yang artinya semua voter harus sepakat baru akses akan diberikan kepada user.

Edit Pada PostController

Delete Pada PostController
+ Dengan $this->denyAccessUnlessGranted('edit', $post);

Dengan menggunakan $this->denyAccessUnlessGranted('edit', $post); maka bila kita mencoba mengakses edit atau delete pada post yang bukan milik kita sendiri maka yang terjadi adalah seperti ini.
![]() |
Access Denied. |

Dengan menggunakan @Security("is_granted('edit', post)", message="Access fobidden my bro!") maka bila kita mencoba mengakses edit atau delete pada post yang bukan milik kita sendiri maka yang terjadi adalah seperti ini.
![]() |
Access denied. |
Pada view Post yang di load Oleh Index
Dengan menggunakan method is_granted maka kita dapat menentukan apa saja yang dapat dan boleh ditampilkan kepada user sesuai dengan hak akses yang dimiliki user tersebut.

Hasil dari kondisi is_granted diatas.
Voter pada post yang bernama PostVoter
Untuk logic dari otorisasi yang kita implementasikan diatas diatur oleh voter berikut ini.

Penampakan Pada Profiler

Comments
Post a Comment