Skip to main content

Menggunakan User Roles dari Database dengan Voter

Roles

Ketika user melakukan login, Symfony memanggil method getRoles() dari object User entity yang digunakan untuk menentukan hak akses yang dimiliki oleh user. Pada User class roles adalah array yang tersimpan di database (atau kadang array harcoded dalam berbagai tutorial supaya cepat saja), dan setiap user selalu memiliki setidaknya satu role yaitu: ROLE_USER (sumber).

src/Entity/User.php

/**
 * @ORM\Column(type="json")
 */
private $roles = [];

public function getRoles(): array
{
    $roles = $this->roles;
    // guarantee every user at least has ROLE_USER
    $roles[] = 'ROLE_USER'; // bila null dari db maka at least ini akan ada

    return array_unique($roles);
} 
 
Berikut ini panduan yang harus dipatuhi bila kita menginginkan untuk dapat menentukan roles untuk tiap-tiap user dalam applikasi kita.
  • Setiap role harus diawali dengan prefix ROLE_ (bila tidak maka akan terjadi masalah dalam penggunaan roles ini).
  • Selain roles yang umum digunakan seperti ROLE_USER, ROLE_ADMIN, anda juga bisa membuat role custum anda sendiri misalnya ROLE_PRODUCT_ADMIN atau ROLE_APAPUN_YANG_ANDA_MAU.
Selanjutnya nanti role-role tersebut akan berperan penting dalam menentukan hak akses pada bagian-bagian spesifik pada website kita. Anda juga dapat menggunakan fitur hirarki  pada hubungan antara role yang berguna memberikan role secara otomatis buat user yang memiliki suatu role tertentu, misalnya role ROLE_ADMIN itu secara otomatis adalah juga ROLE_USER.

Roles dari database

Buat Kolom roles di Table user

Setup User entity supaya menggunakan roles dari database dengan mensetup property $roles lengkap dengan doctrine annotationnya.

Sampai disini mari kita sesuaikan database kita terutama bagian table user supaya menambahkan column roles.

Dengan menggunakan perintah bin/console doctrine:schema:update --force.

Atau menggunakan migration ./bin/console doctrine:migration:diff yang disusul oleh ./bin/console doctrine:migration:migrate.

Hasil dari proses diatas adalah sebagai berikut.

Update Fixtures Supaya memiliki Roles

Update Fixtures

Pada file fixture misalnya AppFixtures  didalam method berikut ini   private function loadUsers(ObjectManager $manager): void tambahkan line berikut:

 

Load Fixtures

selanjutnya adalah load fixture yang sebelumnya dibuat dengan menggunakan fixture load ./bin/console doctrine:fixture:load sebagai berikut:
Hasil dari proses diatas akan menghasilkan sebagai data-data sebagai berikut:

Sampai sini kita sudah memiliki admin dengan ROLES bermacam-macam dan user lain yang roles columnnya berisi null, dia bisa null karena di getter sudah dihandle minimal kalo user itu pasri ROLE_USER.

Selanjutnya mari kita login dengan admin yang tadi kita tambahkan di fixture.


Perhatikan pada profiler tentang keberadaan roles yang barusan kita buat dan tambahkan pada user admin.



Integrasi Dengan Voter

Bila sebelumnya saya mencatat tentang bagaimana menggunakan voter supaya hanya user yang membuat artikel tsb yang bisa mendelete, edit sebuat post maka kali ini saya akan sedikit memodifikasi Voter supaya ROLE_ADMIN bisa menghapus dan edit post yang bukan miliknya.

Bila ingin tau implementasi sederhana voter yang saya lakukan sebelumnya silahkan baca catatan saya pada bagian berikut ini

Sebelum implementasi voter

User admin tidak memiliki kemampuan untuk menghapus post milik orang lain.



Sedikit penyesuaian pada voter (PostVoter.php) sebagai berikut:

Inject Decision Manager pada Constructor PostVoter




Tambahkan kondisi yang mengenali ROLE_ADMIN pada fungsi berikut ini  voteOnAttribute($attribute, $subject, TokenInterface $token) sebagai berikut:



Hasilnya

Sekarang admin bisa mengedit post milik joni.



Selesai!

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....