Implementasi Relationship Antara Model User dan BlogPost
Saat ini di table blog_post kita sudah memiliki column user_id, namu tid model ya kita belum melakukan implementasi relationship. Sekarang kita akan mengimplementasikan relationship di model User dan BlogPost. User has-many BlogPost dan BlogPost belongs-to User. Implemetasi nya nanti seperti sintak dibawah ini buka file app/Models/BlogPost.php, tambahkan code dibawah ini
Buka file app/Models/User.php, tambahkan code dibawah ini.
Buka file resources/views/posts/partials/post.blade.php, tambahkan code dibawah ini.
Buka file resources/views/posts/show.blade.php, tambahkan code dibawah ini.
Lalu buka tampilan blog post dah show blog post maka akan sperti dibawah ini
Implementasi Update Post Hanya Oleh User Yang Meng-Create Post Tersebut Menggunakan Laravel Gate
KIta akan meng-authorize user yang melakukan update post. Misalkan BlogPost A di create oleh User A, maka hanya User A yang bisa melakukan update BlogPost A. Buka file app/Providers/AuthServiceProvider.php, tambahkan code dibawah ini.
Buka file App/Http/Controller/PostsController.php tambahkan sintak dibawah ini
Sekarang coba login dengan user1@mail.com (atau user lain), kemudian edit salah satu blog post yang di create oleh user lain, maka ketika tombol update di klik akan muncul error 403 forbidden.
Sekarang kita implementasikan juga authorization untuk function edit(). Buka file app/Http/Controllers/PostsController.php, tambahkan code dibawah ini.
Cara Lain Untuk Meng-Authorize Menggunakan authorize() method
Sekarang kita akan mengimplementasikan authorization untuk delete function. Buka file app/Providers/AuthServiceProvider.php, tambahkan code dibawah ini
Buka file app/Http/Controllers/PostsController.php, tambahkan code dibawah ini.
Silahkan coba delete Post yang di create oleh user lain Untuk mengetahui lebih detail mengenai Gate di laravel, bisa kunjungi halaman ini Laravel Gates
Implementasi SuperUser Dan Override Permission
Kita akan mengimplementasikan superuser, yang mana user ini bisa override permission atau atuthorization yang ada. Untuk implementasi superuser kita akan menambahkan column is_admin ketable users. Buat migration baru dengan menjalankan command dibawah ini.
Buka file database/migrations/[yyyy_mm_dd_time]_add_is_admin_to_users_table.php, dan tambahkan code dibawah ini.
Jalan migration command.
Buka file database/factories/UserFactory.php, tambahkan code dibawah ini.
Kita melakukan settingan bahwa user1@mail.com adalah superuser. 7. Jalankan command db refresh dan seed.
Buka file app/Providers/AuthServiceProvider.php, dan tambahkan code dibawah ini
Sekarang coba login dengan user1 @mail.com kemudian edit atau delete blog post yang di create oleh lain.
Code diatas digunakan untuk override semua Gate atau permission. Untuk override Gate tertentu, kita bisa mengubahnya menjadi seperti ini.
Buka file app/Http/Controllers/PostsController.php, dan tambahkan code dibawah ini.
Sekarang super user hanya bisa melakukan update saja tidak bisa melakukan delete
Implementasi Authorization Menggunakan Laravel Policy
Salah satu kekurang authorization menggunakan Gate adalah code nya harus ditulis dalam satu file yakni app/Providers/AuthServiceProvider.php. Ketika aplikasi menjadi besar, maka satu file tersebut akan menjadi susah untuk di manage. Salah satu solusi dan best practice di laravel untuk menghandle masalah ini adalah dengan menggunakan Laravel Policy Untuk lebih detail, bisa kunjungi halaman ini Laravel Policies Kita akan implementasi Policy untuk model BlogPost. Create policy file dengan menjalankan command di bawah ini
Command di atas akan generate file app/Policies/BlogPostPolicy.php. Sekarang kita akan memindahkan logic permission untuk BlogPost dari file app/Providers/AuthServiceProvider.php ke file app/Policies/BlogPostPolicy.php. Buka file app/Policies/BlogPostPolicy.php, dan tambahkan code dibawah ini
Buka file app/Providers/AuthServiceProvider.php, kemudian ubah code nya menjadi seperti ini
.Pada file controller app/Http/Controllers/PostsController.php, ubah code dibawah ini menjadi
- Gate::denies('update-post', $post) → Gate::denies('posts.update', $post)
- Gate::denies('delete-post', $post) → Gate::denies('posts.delete', $post)
Coba untuk melakukan edit atau delete post, maka permission nya tetap akan berjalan dengan baik. untuk menyederhanakan code pada file app/Providers/AuthServiceProvider.php, maka kita bisa mengubah kode menjadi seperti dibawah ini
Implementasi Authorization Pada View
Saat ini yang kita authorize adalah sisi controller. Sekarang kita akan implementasi authorization di sisi view. Kita akan meng-hide button Edit dan Delete di halaman http://localhost:8000/posts. Buka file app/Providers/AuthServiceProvider.php, tambahkan code di bawah ini
Buka file resources/views/posts/partials/post.blade.php, ubah code nya menjadi seperti ini
Sekarang coba buka halaman /posts, maka ada beberapa post yang tombol Edit dan Delete nya tidak muncul.






























No comments:
Post a Comment