Skip to main content

Otorisasi akses user menggunakan Voters pada Symfony 4

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?").

Dalam rangka mengecek boleh atau tidaknya user mengakses suatu fitur, semua keputusan dari voters ditentukan oleh apa yang disebut sebagai Access Decision Manager. Maka akses yang dimiliki user terhadap suatu fitur adalah tergantung konfig dari aplikasi kita, permission bisa diberikan bila semua voters yang ada berkata "Ya" (unanimous), atau mayoritas dari voters yang ada mengatakan "Ya" (consensus), atau jika ada setidaknya satu voter yang berkata "Ya" (affirmative). 


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:


  1. AuthenticatedVoter
  2. RoleVoter
  3. RoleHierarchyVoter
  4. ExpresionVoter

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 file security.yaml dan tambahkan baris berikut.

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 Annotation @Security


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

Demikianlah catatan sederhana ini mencatat tentang bagaimana penggunaan dasar Voters pada Symfony untuk mengatur hak akses terhadap sesuatu. 

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Semalam kemarin (09 Januari 2019) tidak sengaja kami sekeluarga lewat Bandung Digital Hub saat pulang dari Fish Wow Cheeseee  yang di Jl. Lombok. Bandung Digital Hub ini sendiri berlokasi tidak jauh dari dari tempat kami makan tersebut, yaitu berlokasi di Jl. Laswi No.7, Kacapiring, Batununggal, Kota Bandung, Jawa Barat 40271. Berhubung untuk bulan Januari 2019 ini sedang tidak masuk ke kantor maka saya putuskan untuk besoknya (hari ini 09 Januari 2019) nyoba untuk bekerja remote dari Bandung Digital Hub , apalagi istri yang kebetulan follower pak Ridwan Kamil di Instagram juga Facebook dan tampaknya pernah lihat ulasan mengenai tempat ini sehingga tampak antusias supaya saya datang ketempat ini ini dan mencoba bekerja dari gedung creative hub dan coworking yang keren ini.  Tempat Parkir Masalah utama saat kita datang ke coworking space terutama yang berlokasi di Bandung (atau mungkin kota-kota lainnya) adalah lahan parkir, kadang lahan parkir ...

Numpang Kerja Remote dari Bandung Digital Valley

Satu lagi co-working place  gratisan dan keren yang cukup populer dikota Bandung, co-working place yang juga memberikan fasilitas tempat kerja (co-working place) dan fitur-fitur menarik lainnya,  co-working place keren  ini adalah Bandung Digital Valley atau yang sering disingkat BDV . C o-working place  Bandung Digital Valley ini  merupakan bagian dari Telkom , mulai aktif digunakan dari sekitar tahun 2012 lalu .  Tempat ini biasanya menjadi tempat favorit bagi para pengiat startup, freelancer, dan mahasiswa . Gedung BDV Gedung BDV Gedung BDV Co-working space Bandung Digital Valley ini sendiri berlokasi di Menara Bandung Digital Valley, Jl. Gegerkalong Hilir No.47, Sukarasa, Sukasari, Kota Bandung, Jawa Barat, detailnya bisa dilihat di Google map berikut. Pemandangan jalan setelah pintu satpam. Free Co-working Space Membership Untuk mulai menggunakan fasilitas co-working space ini secara gratis maka yang pe...

Membuat Authentikasi Berbasis Token pada Spring Boot dengan Spring Security dan JWT

Setelah beberapa kali mencari tutorial tentang otentikasi aplikasi web Spring Boot dengan menggunakan JWT yang mudah dipahami akhirnya saya menemukan artikel berbahasa Inggris tapi sangat mudah dipahami  dan diikuti, artikel tersbut berada disini , dengan judul " Spring Boot Token based Authentication with Spring Security & JWT ". Untuk memudahkan orang-orang yang terbiasa membaca artikel dalam bahasa indonesia (termasuk saya sendiri), artikel ini saya buat dan susun ulang (artikel aslinya tidak tertulis dengan runtut dan dapat membuat pemula bingung dengan berbagai error yang muncul) supaya lebih mudah untuk diikuti dan dapat di gunakan bersama. Applikasi yang akan kita buat adalah aplikasi web yang setiap endpoint-nya hanya bisa di akses oleh role tertentu. 1. Tools Yang Diperlukan IntelliJ Idea text editor. Spring Assistant Plugin. Postman. PostgreSQL + DBeaver. Min Java 8 Spring Boot 2.1.8 (dengan Spring Security, Spring Web, Spring Data JPA). jjwt 0.9.1. Maven 3.6.1....