Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Sistem Login Yang Lebih Baik

by
Read Time:31 minsLanguages:

Indonesian (Bahasa Indonesia) translation by Andy Nur (you can also view the original English article)

Net.tuts+ telah menerbitkan beberapa tutorial hebat tentang sistem login pengguna. Kebanyakan tutorial hanya berurusan dengan otentikasi pengguna, yang memungkinkan untuk dua tingkat keamanan: login dan tidak masuk. Untuk banyak situs, diperlukan kontrol yang lebih ketat untuk mengontrol ke mana pengguna dapat pergi dan apa yang dapat mereka lakukan. Membuat sistem daftar kontrol akses / access control list (ACL) yang akan memberikanmu fleksibilitas untuk butiran perizinan.



Pengenalan

Final ProductFinal ProductFinal Product

Bayangkan kamu menjalankan situs tutorial hebat yang memungkinkan pengguna belajar tentang berbagai teknik pengembangan web. Selain pembacamu yang biasa, kamu memiliki beberapa anggota yang berlangganan premium, juga berkontribusi sebagai penulis dan administrator.

Masalahmu

Kamu ingin membatasi pengguna hanya pada halaman tertentu yang dapat diakses oleh akun khususnya.

Solusi

Menerapkan daftar kontrol akses akan memungkinkanmu banyak mengontrol apa yang dapat dan tidak dapat diakses pengguna di situsmu.

Jika kamu melihat demo, tersedia dengan kode sumber yang dapat diunduh, kamu akan disambut dengan halaman indeks yang menguji ACL untuk setiap pengguna. Kamu dapat memilih tautan berbeda di bagian bawah untuk melihat ACL untuk pengguna yang berbeda. Jika kamu mengeklik tautan 'Admin Screen' di dekat bagian atas, Kamu dapat melihat contoh antarmuka admin yang memungkinkanmu mengelola pengguna, peran, dan perizinan. CATATAN: Sistem admin akan melakukan pemulihan basis data setiap 30 menit untuk memastikan semuanya tetap di atas dan di atas. File unduhan juga mengimplementasikan keamanan ACL di situs admin, jadi jika pengguna nomor satu tidak memiliki izin "akses admin", kamu tidak akan dapat mengakses situs admin.

Sistem ini akan memungkinkanmu untuk membuat grup pengguna yang berbeda (yaitu tamu, anggota premium, kontributor, dan admin). Kita akan dapat mengatur perizinan unik untuk setiap grup, serta untuk pengguna individu. Mari kita mulai dengan menyiapkan database MySQL.


Langkah 1: Membuat Database

ACL kita akan disimpan dalam database relasional menggunakan enam tabel (termasuk tabel untuk pengguna). Kamu seharusnya sudah memiliki database yang disiapkan di lingkungan kerja host-mu. Kita akan membuat struktur tabel berikut:

Database tablesDatabase tablesDatabase tables

Kode untuk membuat database tersedia dalam file sumber (install.sql), dan ada juga file lain (sampleData.sql) yang akan membuat 4 contoh pengguna, bersama dengan beberapa tugas dan izin untuk kamu uji. Cukup buka file dengan editor teks favoritmu, dan salin/tempel kode ke dalam panel SQL di phpMyAdmin.


Langkah 2: Memasukkan Database

Kita perlu membuat file include agar kita dapat terhubung ke database kita. Buat file yang disebut assets/php/database.php dan tambahkan kode berikut ke dalamnya (ganti nilai variabel dengan informasi yang sesuai untuk situasi hosting-mu):

Pada baris pertama kode, kita memanggil session_start(); kita tidak akan benar-benar menggunakan variabel session tetapi kamu akan membutuhkannya sebagai bagian dari sistem login pengguna. Kemudian, kita memanggil ob_start() untuk membuat penyangga output. Biasanya, ketika PHP menghasilkan halaman, itu akan dikirim ke browser seperti yang dihasilkan. Dengan menggunakan ob_start(), halaman dan header tidak dikirim ke browser sampai dimuat sepenuhnya, atau sampai kita memanggil ob_end_flush(). Dengan menyangga halaman, kita dapat mengalihkan menggunakan PHP pada titik mana pun di halaman, bukan hanya di bagian atas. Setelah header dikirim, satu-satunya opsi pengalihan kita adalah dengan JavaScript. Seorang hacker yang giat dapat dengan mudah mematikan JavaScript, dan kemudian melihat halaman tanpa jaminan kita dalam semua kejayaan itu. Baris yang satu ini memungkinkan kita untuk menolak akses pengguna pada titik mana pun di halaman jika diperlukan.

Baris 4-8 mengatur variabel kita. $hasDB adalah boolean yang digunakan untuk menentukan apakah kita terhubung. $server, $user, $pass, dan $db adalah argumen koneksi untuk server. Jalur 9 terhubung ke server, sementara jalur 10 menentukan apakah koneksi berhasil. Jika ya, kita pilih database yang akan digunakan; jika tidak, kita menampilkan pesan error menggunakan die().


Langkah 3: Membuat Class ACL

Langkah ini cukup panjang, karena kita membuat class ACL yang akan membentuk dasar dari sistem kita. Saya mohon maaf sebelumnya atas lamanya langkah ini.

ACLACLACL

Sistem ACL kita akan berorientasi objek, jadi mari kita mulai membuat file class. Kita mulai dengan menambahkan definisi class, definisi variabel, dan konstruktor ke file /assets/php/class.acl.php:

Analisis

Setelah membuat definisi class, kita membuat tiga variabel class untuk menyimpan informasi yang akan digunakan dalam pembuatan ACL.

Metode Constructor

Fungsi __constructor() digunakan untuk menginisialisasi objek ketika kita ingin memuat ACL. Ini disebut secara otomatis ketika kita memanggil new ACL();. Kemudian diteruskan secara tunggal, argumen opsional dari pengguna untuk memuat ACL. Di dalam konstruktor, kita memeriksa untuk melihat apakah user ID diteruskan. Jika tidak ada ID yang diteruskan, kita berasumsi bahwa kita akan memuat ACL untuk pengguna yang saat ini masuk; jadi kita baca di variabel session untuk itu. Sebagai alternatif, jika kita memberikan user ID, itu memungkinkan kita untuk membaca dan mengedit ACL untuk pengguna selain yang login (berguna untuk halaman adminmu).

Setelah kita membaca di user ID, kita memanggil getUserRoles() untuk menghasilkan array dari peran yang ditugaskan kepada pengguna dan menyimpannya dalam variabel class $userRoles. Pada akhir constructor, kita memanggil buildACL() untuk menghasilkan ACL yang sebenarnya. Metode bernama ACL() adalah penopang untuk instalasi PHP4. Ketika Anda memanggil new ACL() di PHP5, interpreter PHP menjalankan metode __constructor(). Namun, ketika kamu menjalankan kode yang sama di PHP4, interpreter menjalankan ACL(). Dengan memberikan metode bernama yang sama dengan class, kita membuat class PHP4 kompatibel.

Setiap kali kita membuat objek ACL baru dengan meneruskan user ID, objek tersebut akan menahan izin untuk pengguna yang dilewati.

Metode Helper

Sekarang, mari tambahkan beberapa metode helper ke file class yang sama. Metode-metode ini akan memberikan dukungan kepada metode lain dengan melakukan tugas-tugas khusus:

getUserRoles()

getUserRoles() akan mengembalikan array peran pengguna yang saat ini ditugaskan. Pertama, kita akan membuat pernyataan SQL yang sesuai dan menjalankannya. Dengan menggunakan while(), kita melakukan perulangan melalui semua hasil yang cocok, dan akhirnya mengembalikan array ID. Demikian juga, getAllRoles() akan mengembalikan semua peran yang tersedia (bukan hanya yang ditugaskan kepada pengguna). Berdasarkan nilai argumen, $format, ia akan mengembalikan array ID untuk semua peran, atau array asosiatif dengan ID dan nama setiap peran. Ini memungkinkan fungsi kita untuk melakukan tugas ganda. Jika kita ingin menggunakan array peran pengguna di MySQL, kita memerlukan array ID peran; tetapi jika kita ingin menampilkan peran di halaman kita, akan sangat membantu jika memiliki satu array dengan semua info di dalamnya.

buildACL

buildACL() menghasilkan array perizinan untuk pengguna, dan merupakan jantung dari sistem. Pertama, kita memeriksa untuk melihat apakah pengguna ditugaskan untuk peran apa pun. Jika ya, kita menggunakan array_merge() untuk menggabungkan rambu perizinan yang ada dengan array baru yang dikembalikan dari panggilan ke getRolePerms() (yang mendapatkan semua izin untuk semua peran yang ditugaskan kepada pengguna). Lalu kita melakukan hal yang sama untuk perizinan pengguna individual, kali ini memanggil getUserPerms(). Hal ini penting bahwa kita membaca izin pengguna kedua karena array_merge() menimpa key yang duplikat. Membaca izin pengguna kedua memastikan bahwa izin individu akan menimpa izin yang diwariskan dari peran pengguna.

Semua fungsi getPermKeyFromID(), getPermNameFromID(), getRoleNameFromID() dan getUsername() hanyalah fungsi "pencarian". Mereka memungkinkan kita untuk mengirimkan ID dan mengembalikan nilai teks yang sesuai. Kamu dapat melihat bahwa kita membuat pernyataan SQL, kemudian jalankan dan kembalikan hasilnya. Selanjutnya kita akan menambahkan dua fungsi yang akan menarik izin dari database.

Fungsi-fungsi ini pada dasarnya identik kecuali untuk tabel yang mereka tarik. Argumen tunggal adalah ID untuk pera/pengguna yang ingin kamu tarik. Fungsi peran dapat meneruskan suatu array atau integer, sementara fungsi pengguna hanya dapat meneruskan integer. Dengan menggunakan is_array(), kita menentukan bagaimana memperlakukan argumen untuk fungsi izin peran. Jika ini adalah array, kita menggunakan implode() untuk membuat daftar yang dipisahkan koma. Dalam kedua kasus, kami menggunakan nilai itu dalam SQL. Kemudian, kita membuat array kosong baru yang disebut $perms - ini akan menyimpan izin secara lokal dalam fungsi.

Di dalam perulangan while(), kita melakukan beberapa fungsi. Pertama kita menghasilkan variabel $pK, yang akan kita gunakan sebagai nama key array. Karena kami akan mencari nilai ini untuk menentukan apakah pengguna memiliki izin khusus, penting untuk kita memilikinya dalam format yang seragam, itulah sebabnya kita menggunakan strtolower(). Jika nilai kunci kosong, kita lewati ke iterasi berikutnya menggunakan continue;. Selanjutnya, kita melihat $row['value'] untuk menetapkan nilai boolean implisit untuk perizinan. Ini memastikan bahwa hanya nilai aktual '1' dalam tabel akan sama dengan true (yaitu pengguna yang memiliki izin), dan penting untuk keamanan. Kalau tidak, kita mengatur perizinan ke false. Di akhir fungsi, kita membuat array dengan beberapa tombol bernama sehingga kita bisa mendapatkan semua informasi tentang perizinan. Array itu diberikan ke key dgn nama baru dalam array $perms yang kita buat sebelumnya. Perhatikan bahwa kita menggunakan $pK untuk membuat indeks dengan nama yang tepat. Akhirnya kita mengembalikan nilai array.

Kamu dapat melihat bahwa dalam array yang dikembalikan, ada nama indeks 'inherited (diwariskan)'. Ini memiliki arti khusus untuk ACL. Jika seorang pengguna menerima izin karena itu memiliki peran pengguna yang ditugaskan, dapat dikatakan diwariskan. Jika izin diberikan kepada pengguna secara manual, itu tidak diwariskan.

Di getAllPerms(), kita membuat daftar semua izin yang tersedia. Mirip dengan getAllRoles() kita dapat menyampaikan argumen format untuk menentukan bagaimana hasilnya akan dikembalikan. Sekarang untuk bagian terakhir dari kelas:

Dua metode terakhir ini sangat penting untuk fungsionalitas ACL. userHasRole() menerima argumen tunggal dari ID peran Dengan mengulang semua elemen dalam array $userRoles, kita dapat menentukan apakah pengguna ditugaskan untuk peran itu. Jika ya, kita mengembalikan true, atau sebaliknya false. hasPermission() adalah metode yang kita gunakan untuk menentukan apakah pengguna dapat mengakses sesuatu. Kami memberikan key untuk izin yang ingin kita periksa. Kami membuatnya seragam dengan mengonversinya menjadi huruf kecil, dan melihat apakah ada indeks dengan nama itu dalam array $perms. Jika ada, kita memeriksa untuk memastikan bahwa itu diatur ke '1' dan mengembalikan true, atau sebaliknya mengembalikan false. Ini adalah fungsi yang akan kita gunakan jika kita ingin mengetahui apakah pengguna dapat melakukan sesuatu.


Langkah 4: Admin Pengguna

Bagian pertama dari bagian admin kita yang akan berurusan dengan pengelolaan pengguna. Kami perlu membuat empat antarmuka berbeda untuk menangani aspek pengelolaan pengguna: Buat daftar pengguna sehingga kita dapat memilih satu untuk diedit, melihat daftar pengguna secara detail, menetapkan pengguna ke peran, dan memberikan izin pengguna.

User FormsUser FormsUser Forms

Buka /admin/users.php dan tambahkan kode berikut:

Seperti biasa, kita perlu menyertakan file database dan ACL kita, dan mengatur objek ACL. Kemudian kita mengatur keamanan untuk halaman. Dalam hal ini, kita memastikan bahwa pengguna memiliki izin 'access_admin'. Jika tidak, mereka akan dialihkan.

CATATAN: Jika kamu mengubah izin ACL sehingga pengguna 1 tidak lagi memiliki izin 'access_admin', kamu tidak akan dapat mengakses situs admin. Juga, kamu harus terlebih dahulu menuju ke /index.php sebelum kamu pergi ke salah satu halaman admin, seperti index.php menetapkan variabel sesi menugaskan kamu userID #1.

Sekarang ini hanya tata letak dasar halaman. Pada langkah selanjutnya, kita akan mengganti <! - PAGE CONTENT -> di atas dengan beberapa kode untuk mengelola pengguna. Kita akan menggunakan variabel querystring $action untuk menentukan antarmuka pengguna mana yang harus kita tampilkan. Ada empat kemungkinan nilai yang akan kita alamatkan: Jika null, kita menampilkan daftar pengguna saat ini. Jika diatur ke 'user', kita menampilkan form untuk satu pengguna. Jika diatur ke 'role', kita menampilkan form untuk menetapkan pengguna. Jika diatur ke 'perms', kita menampilkan form untuk memberikan izin pengguna.

Daftar Pengguna

Tambahkan kode ini di dalam div dengan id 'page':

Konsepnya di sini cukup sederhana. Kita membuat kueri SQL, menjalankannya, dan melakukan perulangan seluruh hasilnya. Untuk setiap pengguna, kita menghasilkan tautan yang memungkinkan kita untuk mengedit pengguna tertentu.

Mengedit Pengguna Individu

Sekarang, tambahkan kode ini langsung di bawah blok kode sebelumnya:

Ketika kita mengedit pengguna, kita perlu memuat ACL untuk pengguna itu. Ini akan memungkinkan kita untuk melihat peran dan izin mana yang mereka miliki. Kita memulainya dengan membuat objek ACL baru, dan meneruskan $userID dari querystring (dengan cara ini kita memuat ACL pengguna itu, sebagai ganti pengguna yang masuk). Setelah itu adalah di mana bentuk pengguna edit normalmu akan pergi. Hal-hal yang umum adalah field teks untuk mengedit nama pengguna, kata sandi, dll. Di bawah ini kita mendaftar peran yang ditugaskan kepada pengguna, dan juga menyediakan tautan sehingga kita dapat menetapkan pengguna ke peran lain. Baris 10-16 memuat semua peran yang ditetapkan oleh pengguna, dan mencetaknya sebagai daftar item menggunakan foreach(). Lalu kita mendaftar izin pengguna dengan cara yang sama. Kita hanya mencetak izin yang dimiliki pengguna, bukan yang diset ke false.

User DetailUser DetailUser Detail

Menugaskan Peran

Form peran penugasan kita akan berakhir seperti ini:

User RolesUser RolesUser Roles

Tambahkan kode ini tepat di bawah blok kode sebelumnya:

Hal pertama yang harus kita lakukan di sini adalah membuat form dan tabel. Tabel akan memiliki 3 kolom: satu untuk peran, satu untuk checkbox anggota, dan satu untuk checkbox non-anggota. Setelah membuat objek ACL baru, kita memuat array dari semua peran menggunakan getAllRoles(). Itu akan memungkinkan kita untuk menampilkan elemen input untuk setiap peran, bukan hanya yang ditugaskan kepada pengguna.

Di dalam perulangan foreach(), kita melakukan hal berikut: Kita memulai baris baru dan mencetak label dengan nama peran. Lalu kami mencetak inputan tombol radio. Nama dan id dari tombol radio dibuat unik untuk setiap peran dengan menggunakan format "role_ [roleID]" (yaitu role_0012). Baris 13 dan 16 menentukan tombol radio mana yang harus diperiksa. Yang pertama akan diperiksa jika pengguna sudah ditugaskan ke grup, sedangkan yang kedua akan diperiksa jika tidak. Perhatikan bahwa seseorang memiliki nilai '1' (untuk penugasan), dan yang lain memiliki nilai '0' (untuk tidak diberikan). Lalu kita akhiri barisnya.

Setelah semua itu, kita tambahkan beberapa elemen tersembunyi yang memberi tahu kita apa yang kita simpan, dan apa yang user ID untuk simpan. Kemudian kita tambahkan tombol kirim dan batal.

Menugaskan Perizinan

Form penugasan perizinan mirip dengan form peran, tetapi dengan masukan yang berbeda, jadi mari tambahkan kode ini:

Seperti bentuk peran, kita mulai dengan menambahkan form dan tabel, kali ini dengan 2 kolom. Kemudian kita membuat objek ACL, tarik array perizinan (baris 8), dan dapatkan array dari semua perizinan (baris 9). Dalam perulangan foreach() kita mencetak baris baru dan nama perizinan. Lalu kita mulai elemen select. Inputan select akan memiliki 3 opsi: Allow, Deny, dan Inherit. Kita melihat nilai $rPerms[$v['Key']]['value'] untuk melihat opsi mana yang harus dipilih. Allow atau Deny tidak akan dipilih jika nilai izin diwarisi berkat $rPerms[$v['Key']]['inheritted'] != true. Jika perizinzan diwariskan, opsi Inherited akan dipilih.

Baris 23-32 meningkatkan opsi pewarisan. Jika izinnya inherited, itu membuatnya dipilih. Kemudian ia menentukan nilai dari izin yang diwariskan dan menetapkan variabel $iVal sehingga kita dapat menggunakan nilai teks dalam label opsi pada baris 33. Setelah mengakhiri input pilih dan tabel, kita menambahkan input tersembunyi untuk mengatur opsi penyimpanan, dan menambahkan tombol kirim dan batal.

Setelah kode ini dijalankan, kita akan berakhir dengan satu baris untuk setiap izin yang tersedia, dan sebuah drop-down yang menunjukkan apakah pengguna memilikinya atau tidak.

User PermissionsUser PermissionsUser Permissions

Menyimpan Data

Tambahkan kode ini ke /admin/users.php tepat di atas tag doc type:

Kode ini pertama kali memeriksa untuk melihat apakah sesuatu telah dikirimkan dengan melihat $_POST ['action']. Ini adalah nilai yang ada di salah satu elemen bentuk tersembunyi dalam dua bentuk yang kita buat.

Jika kita hanya mengirimkan form peran, hal berikut terjadi:

  1. Kita membuat querystring $redir yang mana kita akan dikirim setelah proses form.
  2. Kita melakukan perulangan melalui semua variabel $_POST.
  3. Menggunakan substr() kita mencari tahu apakah 5 digit pertama dari nama variabel adalah "role_". Dengan cara ini kita hanya mendapatkan inputan perizinan dalam langkah-langkah berikut.
  4. Jika nilai untuk input saat ini sama dengan '0' atau 'x' (yaitu kita tidak ingin pengguna memiliki peran ini), kita melakukan query delete. Jika kita menghapus peran dari tabel user_roles, pengguna tidak lagi ditugaskan untuk peran tersebut.
  5. Jika nilainya bukan '0' atau 'x' (baris 14), kita melakukan kueri ganti.
  6. Untuk kueri baik, kita menggunakan sprintf() untuk keamanan (sprintf() memaksa pengetikan variabel dan membantu melindungi terhadap serangan injeksi SQL, info lebih lanjut).
  7. Kita mengeksekusi SQL menggunakan mysql_query().

Catatan pada query replace: sintaks replace adalah sintaks MySQL khusus yang memungkinkan pembaruan atau penyisipan yang mulus. Dengan menggunakan ganti, itu bisa menyelamatkan kita dari menulis banyak kode PHP. Saat kita membuat tabel user_roles, kita membuat indeks unik di field userID dan roleID. Saat kita menjalankan pernyataan 'replace into', pertama kali terlihat di tabel untuk melihat apakah menyisipkan baris baru akan membuat duplikat (yaitu baris dengan nilai indeks yang sama sudah ada). Jika ada baris yang cocok dengan indeks, itu akan memperbarui baris tersebut. Jika tidak ada, itu akan menyisipkan baris baru. Untuk info lebih lanjut, lihat situs pengembang MySQL.

Jika kita hanya menyerahkan formulir izin, prosesnya sama, kecuali kita mencari awalan yang berbeda pada nama masukan, dan menggunakan tabel basis data yang berbeda. Setelah semua operasi selesai, kita menggunakan header('location: ...') untuk mengarahkan kembali ke halaman kita, dan kita menambahkan variabel querystring $redir yang kita buat.


Langkah 5: Peran Admin

Sekarang setelah kita menyelesaikan form untuk mengelola pengguna kita, kita perlu mengelola peran kita. Peran akan lebih sederhana, hanya ada dua tindakan: melihat daftar peran, atau mengedit peran. Buat /admin/roles.php dengan kode berikut:

Daftar Peran

Seperti halaman pengguna, kita mulai dengan menyertakan, membuat objek ACL, dan format halaman. Tindakan standar kita (halaman dimuat tanpa querystring) adalah daftar peran yang tersedia, jadi masukkan kode ini di tempat <!-- PAGE CONTENT -->:

Pertama kita periksa apakah variabel querystring kosong. Lalu kita menyimpan daftar semua peran yang tersedia dalam $roles dengan menggunakan getAllRoles(). Pada setiap iterasi dari perulangan foreach(), kita membuat tautan yang akan membawa kita ke form untuk mengedit peran individual. Jika tidak ada peran dalam array $roles, kita menampilkan pesan yang ramah. Akhirnya, kita tambahkan tombol yang akan memungkinkan kita menambahkan peran baru.

Mengedit Peran

Tambahkan kode ini di /admin/roles.php di bawah blok sebelumnya:

Setelah memeriksa untuk memastikan variabel querystring ada di sana, kita melihat apakah roleID diteruskan dalam querystring. Jika salah satunya, kita menganggap bahwa kita mengedit peran, jika tidak kita membuat satu (kita tampilkan header yang sesuai). Kemudian kita membuat sebuah form. Di dalam form, kita memerlukan input teks untuk nama peran kita, dan tabel untuk mempertahankan perizinan. Tabel memiliki kolom untuk nama perizinan, allow, deny, dan ignore. Seperti yang kami lakukan saat mengedit izin pengguna, kita harus mengulang melalui array untuk semua perizinzan (baris 15, $myACL->getAllPerms('full'))

Di setiap baris, kita mencetak nama perizinzan, dan 3 tombol radio. Radio menggunakan nomenklatur yang sama dengan bentuk pengguna ("perm_[permID]"). 'Allow' atau 'Deny' dipilih tergantung pada nilai dari perizinan yang disimpan (berkat baris 19 dan 22). Jika kamu memilih 'ignore', tidak ada nilai yang disimpan untuk kombo peran/perizinan tersebut. Perhatikan bahwa dua if() blok yang pertama memiliki && $_GET['roleID'] != '' di dalamnya. Ini memastikan bahwa jika tidak ada user ID yang diteruskan (bahwa kita membuat peran baru), ignore dipilih secara default. Kemudian kita menambahkan input tersembunyi untuk mengatur opsi penyimpanan, dan menutup form. Kami juga menambahkan form lain dengan inputan tersembunyi untuk menghapus peran, dan form lain dengan tombol batal yang akan mengembalikan kita ke halaman peran.

Jika semuanya berjalan sesuai rencana, kita harus mendapatkan yang berikut ketika kita mencoba mengedit perizinan untuk peran:

Role PermissionsRole PermissionsRole Permissions

Menyimpan Data

Masukkan kode ini di /admin/roles.php tepat sebelum tag doc type:

Seperti pada halaman pengguna, kita memeriksa untuk melihat apakah ada sesuatu yang dikirimkan melalui $_POST, dan berapa nilai $_POST ['action']. Jika kita menyimpan peran, kita melakukan hal berikut:

  1. Lakukan kueri penggantian di tabel roles. Ini akan memperbarui/memasukkan nama peran. Baris 8-13 melakukan fungsi penting untuk menyimpan peran. Jika kami melakukan pembaruan, kita sudah memiliki ID untuk peran tersebut. Namun jika kita memasukkannya, kita tidak tahu peran ID. Saat kami melakukan kueri penggantian, jumlah baris yang terpengaruh dikembalikan. Jika jumlah baris yang terpengaruh lebih besar dari 1, sebuah baris diperbarui, jadi kita harus menggunakan id peran dari form. Jika baris yang terpengaruh tidak lebih besar dari 1, barisnya dimasukkan, jadi kita menggunakan mysql_insert_id() untuk mendapatkan ID untuk baris yang dimasukkan terakhir.
  2. Kemudian kita melakukan perulangan melalui variabel $_POST dan baris 16 memastikan bahwa kita hanya memproses baris di mana nama input dimulai dengan "perm_".
  3. Baris 18 mendapatkan floatval() dari iperizinan sehingga kita berakhir dengan hanya ID integer dari perm (jadi kita tahu perizinan mana yang kita hadapi).
  4. if ($v == 'x') {...} akan berjalan jika kita memilih 'Ignore' untuk perizinan pada form. Ini akan mencoba untuk menghapus baris dari tabel di mana row ID dan permission ID benar. Jika ini terjadi, kita menggunakan continue; untuk menuju ke variabel berikutnya.
  5. Jika kami telah sampai ke titik ini, kita berasumsi bahwa kita ingin menambahkan atau memperbarui izin untuk peran ini. Jadi, kita menggunakan sintaks 'replace into' yang kita gunakan dalam form pengguna. Hal ini penting, bahwa kita memiliki roleID dan permID di sana sehingga database dapat memeriksa baris yang ada.
  6. Akhirnya kita jalankan SQL dan redirect ke halaman peran.

Jika kita telah mengirimkan form hapus, kita menghapus peran dari tabel peran. Lalu kita juga menghapus data apa pun dari tabel user_roles dan role_perms yang cocok dengan role ID sehingga kita tidak berakhir dengan pengguna dan izin yang ditetapkan untuk peran yang tidak ada. Lalu kita beralih ke halaman peran.


Langkah 6: Perizinan Admin

Seperti admin peran, admin perizinan akan memiliki dua fungsi: daftar perizinan yang tersedia, dan pengeditan perizinan. Awali dengan kode ini di /admin/perms.php:

Daftar Perizinan

Tempatkan kode ini di halaman div (menggantikan <!-- PAGE CONTENT -->):

Kita pertama akan menggunakan getAllPerms() untuk mendapatkan array dari semua perizinan. Lalu kita akan melakukan perulangan melaluinya untuk membuat daftar kita. Setiap iterasi melalui perulangan foreach() akan menghasilkan tautan yang akan mengarahkan kita ke halaman untuk mengedit perizinan yang diberikan. Jika tidak ada perizinan, kita menampilkan pesan yang mengatakan demikian, dan kita mengakhiri form-nya dengan tombol 'New Permission'. Dan hasilnya:

Permissions FormPermissions FormPermissions Form

Mengedit Perizinan

Untuk mengedit/menambahkan izin individu, kita perlu menambahkan kode ini segera setelah blok sebelumnya:

Seperti yang kita lakukan di form peran, kita memeriksa untuk melihat apakah permission ID disediakan dalam querystring dan menampilkan baik tambahan atau pembaruan header berdasarkan itu. Kita membuka tag form, dan menambahkan dua input teks: satu untuk nama perizinan, yang lain untuk key perizinan. Namanya adalah apa yang akan muncul pada form, sementara key-nya adalah apa yang akan kita gunakan dalam skrip. Key-nya harus hampir sama dengan namanya, kecuali untuk itu tidak boleh ada spasi atau simbol, dan harus huruf kecil. Untuk kedua field teks, kita memberikan nilai default jika kita memperbarui.

Di akhir form, kita menambahkan inputan tersembunyi, dan tombol kirim. Lalu kita memiliki form hapus dan batal.

Menyimpan Data

Akhirnya, kita perlu menyimpan form perizinan, jadi tambahkan kode ini ke bagian atas /admin/perms.php tepat di atas doc type.

Seperti semua skrip pengiriman lainnya, kita perlu mencari tahu tindakan apa yang diajukan. Jika kita menyimpan perizinan, kita melakukan penggantian ke dalam operasi. Ini akan memperbarui atau menyisipkan sebagaimana mestinya. Jika kita mengirimkan form hapus, kita melakukan kueri delete. Pada kedua kasus, kita akan diarahkan ke perms.php.


Langkah 7: Pusat Admin

Kita membutuhkan titik lompatan untuk admin ACL kita. Kita hanya akan membuat sesuatu yang sederhana dengan tautan ke 3 halaman. Berikut ini pratinjau dan kode untuknya:

Cukup jelas, kita memiliki 3 tautan untuk mengelola 3 aspek berbeda dari ACL-mu.


Langkah 8: Mengimplementasikan ACL di Situsmu

IndexIndexIndex

Menerapkan sistem ACL baru di situsmu cukup mudah. Setiap halaman yang ingin kamu amankan harus memiliki file database dan ACL yang disertakan di bagian atas. Setelah itu, kamu harus membuat instance baru dari objek ACL.

Sebagai contoh, katakanlah kamu sudah membuat perizinan dengan key 'access_admin' dan ingin menggunakannya untuk mengontrol akses ke antarmuka admin. Di bagian atas halamanmu, kamu dapat menggunakan script ini untuk memeriksanya:

Seperti yang kamu lihat kita membuat objek ACL. Karena kita tidak meneruskan user ID sebagai argumen, sistem akan membaca variabel session $_SESSION ['userID']. Kemudian kita menggunakan $myACL->havePermission ('access_admin') untuk memeriksa apakah pengguna memiliki perizinan tersebut. Jika tidak, mereka dialihkan ke insufficientPermission.php. Dengan cara ini mereka tidak dapat masuk untuk mengamankan area yang tidak mereka miliki perizinannya.

Dalam file sumber yang disediakan, saya telah menyediakan file indeks yang menyediakan tes ACL sederhana berdasarkan kode contoh di atas. Indeks contoh menampilkan daftar semua perizinan dan ikon yang mewakili apakah pengguna saat ini dapat mengakses masing-masing. Ada juga daftar pengguna yang memungkinkanmu untuk mengubah pengguna bahwa ACL ditampilkan untuknya. Berikut ini kode untuk indeks sampel:


Pemikiran Akhir

Ketika dikombinasikan dengan platform manajemen pengguna yang baik, sistem ACL adalah cara yang bagus untuk mengamankan situs web-mu. Dengan mengikuti langkah-langkah ini, kamu harus dapat membuat sistem keamanan fleksibelmu sendiri. Sistem admin yang dibuat di sini adalah contoh dasar dari apa yang dapat kamu buat jika kamu belum memiliki pengaturan sistem admin. Ini menunjukkan semua prinsip yang kamu butuhkan untuk mengelola ACL-mu secara efektif. Di sisi lain, jika kamu sudah membuat sistem manajemen penggunamu sendiri, itu harus cukup mudah untuk mengambil teknik ini dan menerapkannya ke dalam proyekmu sendiri.

  • Berlangganan RSS Feed NETTUTS untuk lebih banyak tutorial pengembangan web harian dan artikel.


Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.