Kod lengkap projek Laravel kali ini InsyaAllah dah siap dan boleh muat-turun dari GITHUB – https://github.com/khirulnizam/lara_acl , cuma tutorial masih dalam proses pembangunan. Tuan/puan sila bookmark dulu, kami akan umumkan bila sudah siap. Templet Bootstrap untuk admin dasboard/panel diubahsuai dari SB-ADMIN. Telah disediakan templet SB-ADMIN dalam layouts dan juga bootstrap framework dalam public/sbadmin
Rangka tutorial
- Controller menambah admin baharu
- Antaramuka tambah admin baharu
- Database migration
- Controller store new admin
- Antaramuka kemaskini maklumat admin (update/delete)
Into projek tutorial ACL Laravel
Tutorial kali ini cuba menerangkan dalam bentuk proof-of-concept bagaimana nak implement beberapa peranan pengguna (user-role) dalam Laravel. Dalam contoh sebelum ini, pengguna ada dua kategori; guest & admin. Guest tidak perlu login untuk melihat maklumat awam (public). Tetapi untuk menambah rekod, kemaskini atau padam rekod perlu pengguna yang sah yang mesti melalui proses login.
Bagaimana kalau kita ada peranan pengguna yang lain contohnya peserta boleh mendaftar kursus, mengedit user-profile atau membatalkan kursus yang telah ditdaftar?
Senarai peranan pengguna (user-roles)
- Tetamu (guest) – boleh memaparkan maklumat umum contohnya carian semua kursus.
- Peserta (participant) – perlu daftar, login dan boleh daftar kursus. Boleh juga melihat kembali senarai kursus yang telah didaftar, batal penyertaan, memperbaharui maklumat profile.
- Penyelenggara (admin) – hanya didaftarkan oleh admin yang lain, perlu login untuk menyelenggara senarai kursus dan penyertaan. Boleh buat carian, kemaskini rekod training, padam rekod training, senaraikan penyertaan peserta.
Model Training dan migrations
Model Training beserta migration file boleh dicipta dengan arahan berikut;
php artisan make:model Training -m
Selepas laksanakan arahan di atas, buka dalam folder database/migrations/create_trainings_table dan tambah arahan berikut dalam function up();
public function up() { Schema::create('trainings', function (Blueprint $table) { $table->increments('id'); $table->string('trainingname'); $table->string('desc'); $table->string('trainer'); $table->timestamps(); }); }
Model User dan migrations
Model beserta migration file telah tersedia untuk table users. Biasanya cuma perlu make:auth untuk implement Auth::user facilities.
php artisan make:auth
Model Role dan migrations
Konsep/carta rekabentuk database Role seperti di bawah. Kita cuma akan hasilkan dua roles, iaitu ‘admin’ dan ‘participant’. Sekiranya anda perlukan multiple user-roles sila google ‘permission’.
php artisan make:model Role -m
Selepas laksanakan arahan di atas, buka dalam folder database/migrations/create_roles_table dan tambah arahan berikut dalam function up();
public function up() { Schema::create('roles', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('description'); $table->timestamps(); }); }
Oleh kerana hubungan (relationship) antara pengguna dan peranan adalah many-to-many, makanya kita perlukan satu table tambahan penghubung roles dengan users.
Untuk mencipta migration file laksanakan arahan di bawah;
php artisan make:migration creata_role_user_table
Buka fail yang terhasil dalam database/migration/create_role_user_table dan tambah kod baris berikut;
public function up() { Schema::create(‘role_user’, function (Blueprint $table) { $table->increments(‘id’); $table->integer(‘role_id’)->unsigned(); $table->integer(‘user_id’)->unsigned(); $table->timestamps(); }); }
Untuk menetapkan hubungan many-to-many antara User dan Role , dalam User model tambahkan function roles( ) dan sediakan kod seperti di bawah;
public function roles() { return $this->belongsToMany(Role::class); //file location app/User.php }
Manakala dalam Role model, tambahkan function user( ) pula;
public function users() { return $this->belongsToMany(User::class); //file location app/Role.php }
Seeder untuk sediakan data cubaan table users & roles
php artisan make:seeder RoleTableSeeder
php artisan make:seeder UserTableSeeder
Untuk menghasilkan dummy data, tambah dalam fail database/seeds/UserTableSeeder.php;
public function run() { // $role_admin = Role::where('name', 'admin')->first(); $role_participant = Role::where('name', 'participant')->first(); //add admin user $admin = new User(); $admin->name = 'Admin Name'; $admin->email = 'admin@example.com'; $admin->password = bcrypt('secret'); $admin->save(); $admin->roles()->attach($role_admin); $admin = new User(); $admin->name = 'Khirulnizam Abd Rahman'; $admin->email = 'kerul@gmail.com'; $admin->password = bcrypt('abc123'); $admin->save(); $admin->roles()->attach($role_admin); //add participant users $participant = new User(); $participant->name = 'Participant Name'; $participant->email = 'participant@example.com'; $participant->password = bcrypt('secret'); $participant->save(); $participant->roles()->attach($role_participant); $participant = new User(); $participant->name = 'Shaqirin'; $participant->email = 'shaq@gmail.com'; $participant->password = bcrypt('shaq123'); $participant->save(); $participant->roles()->attach($role_participant); $participant = new User(); $participant->name = 'Azroy'; $participant->email = 'azroy@gmail.com'; $participant->password = bcrypt('azroy123'); $participant->save(); $participant->roles()->attach($role_participant); }
Dalam fail database/seeds/RoleTableSeeder.php;
public function run() { // $role_employee = new Role(); $role_employee->name = 'admin'; $role_employee->description = 'Admin User'; $role_employee->save(); $role_manager = new Role(); $role_manager->name = 'participant'; $role_manager->description = 'Participant User'; $role_manager->save(); }
Dalam fail database/seeds/TrainingTableSeeder.php;
public function run() { // $this->call(UsersTableSeeder::class); DB::table('trainings')->insert([ 'trainingname' => 'Laravel 101', 'desc' => 'Web development using PHP framework Laravel', 'trainer' => 'Khirulnizam Abd Rahman', 'filename' => 'sig-fstm.png', ]); DB::table('trainings')->insert([ 'trainingname' => 'Android SQLite', 'desc' => 'Android Studio apps development with local database using SQLite', 'trainer' => 'Khirulnizam Abd Rahman', 'filename' => 'android-sqlite.png', ]); DB::table('trainings')->insert([ 'trainingname' => 'Video Editing Filmora', 'desc' => 'An easy video editing using Filmora editor ', 'trainer' => 'Muizz Salleh', 'filename' => 'muiz-filmora.png', ]); }
Dalam fail database/seeds/DatabaseSeeder.php
public function run() { // Role comes before User seeder here. $this->call(RoleTableSeeder::class); // User seeder will use the roles above created. $this->call(UserTableSeeder::class); // Training seeder dummy data $this->call(TrainingTableSeeder::class); }
Seterusnya dalam model app/User.php , tambahkan tiga fungsi-fungsi berikut;
public function authorizeRoles($roles) { if (is_array($roles)) { return $this->hasAnyRole($roles) || abort(401, 'This action is unauthorized.'); } return $this->hasRole($roles) || abort(401, 'This action is unauthorized.'); } /** * Check multiple roles * @param array $roles */ public function hasAnyRole($roles) { return null !== $this->roles()->whereIn('name', $roles)->first(); } /** * Check one role * @param string $role */ public function hasRole($role) { return null !== $this->roles()->where('name', $role)->first(); }
Percubaan login sebagai admin / participant
Berdasarkan UserTableSeeder di atas, terdapat pengguna yang diberikan role ‘admin’ dan ‘participant’. Cuba paparkan skrin login dan cuba kedua-dua peranan penngguna berikut. Perhatikan bahawa kedua-dua peranan user mendapat skrin panel pengguna yang berbeza.
Admin username: admin@example.com; dengan password secret.
Participant username: participant@example.com; dengan password secret.
Perbezaan paparan ini boleh dilakukan dengan menujukan kepada skrin yang berbeza apabila jenis peranan berbeza login masuk sistem. Ini boleh dilakukan dalam app/HomeController.php
public function index(Request $request) { if (Auth::user()->hasRole('admin')){ $trainings = Training::all()->toArray(); return view('home', compact('trainings')); } else if(Auth::user()->hasRole('participant')){ return view('homeparticipant'); } }
Apabila peranan pengguna adalah ‘admin’ (hasRole), HomeController akan redirect ke resources/views/home.blade.php , manakala sebaliknya apabile peranan pengguna (hasRole) adalah ‘participant’- maka akan dipaparkan pula resources/views/homeparticipant.blade.php
resources/views/homeparticipant.blade.php
@extends('layouts.sbadmin') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-10"> <div class="card"> <div class="card-header">Participant Panel</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif Hello participant {{ Auth::user()->name }} <a href="{{ url('trainings') }}"> Training list</a> </div> </div> </div> </div> </div> @endsection
resources/views/home.blade.php
@extends('layouts.sbadmin') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-10"> <div class="card"> <div class="card-header">Dashboard</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success"> {{ session('status') }} </div> @endif Hello administrator {{ Auth::user()->name }} <a href="{{ url('trainings') }}"> Training menus</a> <a href="{{ url('trainings/create') }}"> :: Create Training</a> <a href="{{ url('admins') }}"> Administrator menus</a> <a href="{{ url('admins/create') }}"> :: Create New Admins</a> <a href="#"> Registrations Report</a> Choose trainings <form method="GET" action="{{url('registerreports')}}" class="form-inline"> @csrf <select name="id" class="form-control"> @foreach($trainings as $training) <option value="{{$training['id']}}"> {{$training['trainingname']}} </option> @endforeach </select> <button type="submit" class="btn btn-info"> Generate </button> </form> </div> </div> </div> </div> </div> @endsection
Kod lengkap projek Laravel kali ini InsyaAllah dah siap dan boleh muat-turun dari GITHUB – https://github.com/khirulnizam/lara_acl
Selamat mencuba dan berjaya!
Rujukan: https://medium.com/@ezp127/laravel-5-4-native-user-authentication-role-authorization-3dbae4049c8a
Modul Laravel bahasa Melayu
Trainer:
KHIRULNIZAM ABD RAHMAN, Pensyarah Jabatan Sains Komputer, FSTM KUIS.
Beliau merupakan seorang trainer dalam bidang pengaturcaraan server dan antaramuka web (web front-end & backend) semenjak tahun 2000. Disamping itu juga amat berminat dalam pembangunan applikasi mobile Android, JSON, LARAVEL dan PHP-MySQL.
Antara kursus yang beliau kendalikan;
Blog peribadi beliau di khirulnizam.com . Beliau boleh dihubungi melalui email khirulnizam@gmail.com , atau Whatsapp: http://wasap.my/60129034614