Ketika mengembangkan proyek web di mana terdapat akun pengguna, pertanyaan sering muncul tentang pengorganisasian sistem peran dan hak untuk membatasi akses ke bagian dan fungsi tertentu dari sistem. Dalam artikel ini, kami membandingkan paket kontrol akses dan merangkum tabel.

Pendahuluan
Dalam versi 5.1, Laravel memperkenalkan Auth Gates, fungsi kerangka kerja built-in untuk kontrol akses. Sampai saat ini, saya harus menggunakan berbagai paket pihak ketiga. Namun, bahkan sekarang, programmer memiliki pilihan: menulis semuanya sendiri atau menggunakan beberapa paket yang sudah jadi. Opsi pertama sangat cocok untuk proyek kecil atau proyek dengan sistem hak dan peran yang sederhana. Paket kedua (dengan pilihan paket yang tepat) memungkinkan penyetelan yang lebih baik.
Tujuan artikel ini adalah untuk meninjau paket yang ada yang menerapkan RBAC (Role Based Access Control) - kontrol akses berbasis peran. Kami akan segera mengklarifikasi bahwa artikel ini tidak berpura-pura sebagai kebenaran pamungkas: setiap pengembang sendiri harus menentukan paket mana yang ia butuhkan (jika ada). Catatan: dalam artikel ini, kami mempertimbangkan RBAC, oleh karena itu, dalam ulasan Sentinel, kami hanya berurusan dengan bagian fungsi yang tersedia ini.
Deskripsi Paket
Izin-Laravel oleh Spatie
Tautan: https://github.com/spatie/laravel-permissionDokumentasi: https://docs.spatie.be/laravel-permission/v3Jumlah unduhan (pada saat penulisan): 3.6M
Versi Laravel: dari 5.8 untuk versi 3
Ketersediaan antarmuka: tidak (Anda dapat menggunakan
paket )
Berdasarkan Laravel Auth: yes
Fitur- Ketersediaan artisan-perintah untuk membuat / menetapkan hak.
- Ruang lingkup jadi oleh peran dan hak.
- Kemampuan untuk memverifikasi hak pengguna menggunakan alat standar karena fakta bahwa paket menggunakan Laravel Auth Gates.
- Kemampuan untuk menggunakan arahan blade dari paket: role (@hasrole), @hasanyrole, @hasallroles, @unlessrole.
- Sinkronisasi hak dan peran.
Catatan: ketika otorisasi () dipanggil untuk kebijakan, jika izin memiliki nama yang sama dengan kebijakan, maka itu akan berfungsi, bukan kebijakan.
Struktur DB
Contoh kode
Bouncer oleh joseph silber
Tautan: https://github.com/JosephSilber/bouncerDokumentasi: https://github.com/JosephSilber/bouncer#introductionJumlah unduhan (pada saat penulisan): 418K
Versi Laravel: dari 5.1.20
Kehadiran antarmuka: tidak (Anda dapat menggunakan
paket )
Berdasarkan Laravel Auth: yes
Fitur- Kemampuan untuk digunakan tanpa Laravel.
- Sinkronisasi hak dan peran.
- Kemampuan untuk memaksakan pembatasan pada hak (untuk kelas model tertentu atau untuk contoh khusus.
- Masalah semua hak untuk entitas "mereka": menggunakan fungsi "toOwn", Anda dapat mengeluarkan semua hak untuk entitas yang dimiliki pengguna (perbandingan bidang id user_id dan $ user-> id dapat dikustomisasi). Anda dapat membatasi hak yang diberikan dengan menggunakan fungsi "to".
- Dukungan multitenancy (berdasarkan fungsi ruang lingkup).
- Kemampuan untuk menggunakan fungsi "lingkup" untuk memisahkan peran dan hak tergantung pada kondisi yang ditetapkan (berdasarkan pengidentifikasi unik) - misalnya, hak di panel admin dan bagian publik dari situs.
- Perintah artisan konsol untuk membersihkan database dari izin yang tidak digunakan.
- Kemampuan untuk dengan cepat mencekal pengguna atau menghapus larangan (kemampuan terlarang).
Catatan: Anda dapat membuat peran dan hak untuk itu hanya dengan satu baris.
Struktur DB
Contoh kodePembatasan hak berdasarkan kelas model atau contoh: Bouncer::allow($user)->to('edit', Post::class); Bouncer::allow($user)->to('edit', $post);
Penerbitan hak untuk entitas "mereka": Bouncer::allow($user)->toOwn(Post::class)->to(['view', 'update']);
Laratrust oleh santigarcor
Tautan: https://github.com/santigarcor/laratrustDokumentasi: https://laratrust.santigarcor.me/Jumlah unduhan (pada saat penulisan): 601K
Versi Laravel: ~ 6.0
Ketersediaan antarmuka: no
Berdasarkan Laravel Auth: no
Fitur- Ini adalah garpu ENTRUST ( https://github.com/Zizaco/entrust ).
- Ada arahan pisau.
- Karena penggantian perintah Laravel standar dengan perintah mereka sendiri, mustahil untuk bekerja dengan blade directive can - Anda harus menggunakan $ user-> can ('edit-user') atau direktif izin .
- Sinkronisasi peran / hak.
- Kemampuan ketersediaan - verifikasi peran dan hak secara simultan.
- Middleware siap.
- Multitenancy berdasarkan tim.
Struktur DB
Contoh kode $user->hasRole(['owner', 'admin']); $user->can(['edit-user', 'create-post']); $user->hasRole('owner|admin'); $user->can('edit-user|create-post'); $user->owns($post)
Sentinel oleh Cartalyst
Tautan: https://github.com/cartalyst/sentinelDokumentasi: https://cartalyst.com/manual/sentinel/3.xJumlah unduhan (pada saat penulisan): 957K
Versi Laravel: 6.2
Ketersediaan antarmuka: no
Berdasarkan Laravel Auth: no
Fitur- Ini tidak hanya mencakup peran dan hak, tetapi juga segala sesuatu yang berkaitan dengan pendaftaran.
- Paket tersebut adalah kerangka agnostik, mis. dapat digunakan tidak hanya di Laravel - Anda hanya perlu menginstal dependensi berikut menggunakan komposer: illuminate / database, illuminate / events, symfony / http-foundation.
- Menggunakan add-on Izin Kadaluarsa Sentinel, Anda dapat mengeluarkan hak atas waktu.
- Mendukung Multitenancy dengan add-on Sentinel Multitenancy.
Catatan: saat menginstal pada Laravel 6.2 dan PostgreSQL murni, kesalahan muncul selama migrasi: tabel pengguna sudah ada. Dalam hal ini, Anda harus mengubah migrasi standar:
Struktur DB
Contoh kode
Laravel-ACL oleh Kodeine
Tautan: https://github.com/kodeine/laravel-aclDokumentasi: https://github.com/kodeine/laravel-acl/wikiJumlah unduhan (pada saat penulisan): 170K
Versi Laravel: 5.0 dan lebih tinggi
Ketersediaan antarmuka: no
Berdasarkan Laravel Auth: no
Fitur- Sinkronisasi peran dan hak.
- Hak waris.
- Memiliki arahan pedang Anda: peran , izin .
- Ketersediaan middleware jadi.
Catatan Beberapa masalah dan solusi selama migrasi:
- Dalam file config / acl, Anda perlu menambahkan opsi users_table dengan nama tabel pengguna untuk memastikan migrasi yang stabil.
- Anda perlu menginstal paket "doctrine / dbal" pada Laravel murni untuk "berteman" dengan migrasi standar, jika tidak, kesalahan dapat terjadi saat memperbarui bidang.
Struktur DB
Contoh kode
Laravel-acl oleh Mateus Junges
Tautan: https://github.com/mateusjunges/laravel-aclDokumentasi: https://mateusjunges.imtqy.com/laravel-acl/Jumlah unduhan (pada saat penulisan): 1.8K
Versi Laravel: 5.0 dan lebih tinggi
Ketersediaan antarmuka: ya (formulir siap pakai)
Berdasarkan Laravel Auth: no
Fitur- Lingkup jadi.
- Sinkronisasi hak untuk grup.
- Memiliki arahan blade Anda: grup , @elsegroup, izin , @elsepermission, @ allpermission, @ allgroups, @anypermission, @anygroup
- Kehadiran perintah bawaan bagi pengrajin untuk membuat grup / hak dan menampilkannya, serta menampilkan hak pengguna.
- Ketersediaan middleware siap pakai: PermissionMiddleware, GroupMiddleware, HierarchicalPermissions, PermissionOrGroupMiddleware.
- Ketersediaan bentuk yang telah ditentukan sebelumnya untuk manajemen peran.
Struktur DB
Tabel ringkasan

Kesimpulan
Setiap paket ini memiliki bidang aplikasi masing-masing, sehingga tidak mungkin untuk memilih pemenang tunggal. Menurut perkiraan kami, izin Laravel dan Bouncer paling cocok untuk sistem peran yang kompleks, tetapi pada saat yang sama ada Laravel-ACL oleh Kodeine dengan hierarki peran. Laravel-ACL oleh Mateus Junges adalah opsi "segar" dan memiliki fungsionalitas yang cukup untuk membangun serangkaian peran moderat. Sentinel adalah solusi universal dengan banyak fitur, selain manajemen peran. Laratrust adalah untuk mereka yang menyukai Entrust.
Juga, orang tidak dapat gagal untuk menyebutkan alat Laravel standar - Gates dan Kebijakan. Mereka memudahkan untuk membedakan akses ke sumber daya dalam aplikasi yang tidak memerlukan pengaturan hak yang kompleks. Jika aplikasi hanya memiliki beberapa peran atau hierarki tidak diperlukan, maka kebutuhan Anda dapat ditutup dengan Gates dan Kebijakan.
Tautan yang bermanfaat