Laravel Gates (pemintas) membolehkan anda memberi kebenaran kepada pengguna untuk mengakses kawasan tertentu aplikasi anda. Anda boleh dengan mudah mentakrifkan pemintas dalam aplikasi anda dan kemudian menggunakannya untuk membenarkan atau menafikan akses.
Andaikan dalam jadual pengguna, terdapat lajur bernama admin
, bergantung kepada sama ada pengguna itu pentadbir, ia boleh sama ada 1
atau 0
. Kami boleh menjamin modul aplikasi kami dengan mudah dengan semakan mudah seperti ini:
Route::get('administration', function(){ if(auth()->check() && auth()->user()->admin){ echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
Jika pengguna tertentu mempunyai baris admin
yang ditetapkan kepada 1
, mereka akan melihat output berikut.
Jika tidak, mereka akan melihat perkara berikut:
Ini kelihatan hebat betul! Kami mempunyai cara mudah untuk membenarkan atau menafikan akses kepada bahagian tertentu aplikasi kami. Walau bagaimanapun, masalahnya ialah: bagaimana jika terdapat sejumlah besar tempat di seluruh aplikasi di mana kebenaran akses pengguna perlu disemak dan diubah suai. Kami perlu mencari kod secara global dan mengubah suai logik ini di mana-mana. Tak cekap sangat.
Untuk ini, kita boleh menentukan Gate (pemintas) dan menggunakannya sepanjang aplikasi.
Untuk menentukan pemintas, anda boleh membuka fail AppProvidersAuthServiceProvider.php
dan menambah yang berikut dalam kaedah boot()
kami:
public function boot() { $this->registerPolicies(); Gate::define('access-admin', function ($user) { return $user->admin; }); }
Kami boleh menggunakan pemintas ini di mana-mana sahaja sepanjang aplikasi di mana kami ingin mengesahkan pengguna pentadbir. Dalam bahagian seterusnya, anda akan melihat cara kami menggunakan pemintas baharu ini.
Untuk menggunakan pemintas, kita boleh memanggil kaedah Gate::allows()
atau Gate::denies()
seperti berikut:
Route::get('administration', function(){ if (Gate::allows('access-admin')) { echo 'Welcome to the admin section'; } else { echo 'You shall not pass'; } });
Sila ambil perhatian: Kaedah
Gate::denies()
akan melakukan semakan terbalik padaGate::allows()
Kelebihan pemintas ialah kita kini boleh menukar definisi kita pada bila-bila masa, dan logik kebenaran akan disegerakkan sepanjang perubahan aplikasi dalam program.
Tujuan lain menggunakan pemintas adalah untuk menyemak kebenaran yang berkaitan dengan data. Mengambil blog sebagai contoh, kami boleh memberikan pengguna kebenaran mengedit pada siaran yang mereka buat.
Kami boleh menghantar data kepada pemintas untuk menyemak sama ada pengguna mempunyai kebenaran untuk melakukan tindakan.
Katakan aplikasi kami mempunyai jadual Siaran dengan lajur user_id
yang mengandungi menciptanya ID pengguna. Kami boleh mentakrifkan Gate (pemintas) untuk menentukan sama ada pengguna boleh mengedit siaran tertentu seperti ini:
Gate::define('edit-post', function ($user, $post) { return $user->id === $post->user_id; });
Dua parameter dihantar ke takrifan pemintas kami. Yang pertama ialah objek $user
yang mengandungi pengguna yang disahkan, dan parameter kedua ialah objek $post
kami.
Petua: Jika tiada pengguna yang disahkan, pemintas akan mengembalikan palsu.
Pemintas akan membenarkan akses jika pengguna yang disahkan adalah pengarang asal; jika tidak, ia akan menafikan akses.
Berikut ialah contoh ringkas cara kita boleh menggunakan pemintas edit-post
baharu.
Route::get('edit/{id}', function($id){ $post = \App\Model\Post::find($id); if( Gate::allows('edit-post', $post) ){ echo 'You can edit this post'; } else { echo 'You shall not pass'; } });
Di atas, kami menggunakan Penutupan Laluan dalam contoh, tetapi kami mungkin mahu memetakan laluan ini kepada pengawal. Ini juga akan membolehkan kami menggunakan fungsi Kebenaran baharu.
Selain kecekapan, sebab lain untuk menggunakan pemintas ialah fungsi pembantu.
Dengan mengandaikan kami memetakan laluan ke pengawal:
Route::get('edit/{id}', 'PostController@edit');
Kami boleh menggunakan pembantu authorize()
untuk menyemak sama ada pengguna yang disahkan mempunyai kebenaran untuk mengedit siaran:
<?php namespace App\Http\Controllers; use App\Models\Post; use Illuminate\Http\Request; class PostController extends Controller { public function edit($id){ $post = Post::find($id); $this->authorize('edit-post', $post); } }
Jika pengawal mewarisi daripada kelas asas AppHttpControllersController
, anda boleh menggunakan fungsi pembantu Gate::allow()
sama seperti fungsi authorize()
.
Akhir sekali, bagaimana jika kita ingin menyemak kebenaran dalam paparan? Kita boleh melakukan ini menggunakan @can
pembantu fungsi Blade.
Anggapkan paparan Blade adalah seperti berikut:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p>
Kita boleh menggunakan fungsi Blade helper @can
untuk menyemak pengguna semasa Sama ada dibenarkan mengedit siaran ini:
nbsp;html> <meta> <meta> <title>{{ $post->title }}</title> <h1>{{ $post->title }}</h1> <p>{!! $post->body !!}</p> @can('edit-post', $post) id }}">Edit Post @endcan
Jika pengguna yang disahkan ialah pengarang asal siaran, mereka akan melihat butang Edit Catatan.
Menggunakan @can
fungsi pembantu boleh menjadikan kod kami lebih mudah dibaca dan diurus. Anda juga boleh menggunakan @cannot
untuk melakukan sebaliknya.
Berikut ialah asas penggunaan Gates (pemintas) dalam aplikasi Laravel. Pemintas membenarkan kami dengan mudah membenarkan pengguna tertentu untuk mengakses kawasan aplikasi kami. Ini juga boleh dipanggil Senarai Kawalan Akses (ACL), senarai kebenaran yang dikaitkan dengan objek. Tetapi kita tidak seharusnya terlalu merumitkan perkara... Dalam senario paling mudah, Pemintas digunakan untuk membenarkan atau menafikan akses. Pengguna boleh sama ada dibenarkan kebenaran atau dinafikan kebenaran. Memandangkan tutorial ini adalah tentang memastikan pengguna melalui dan bukan melalui...adalah wajar untuk menghantar anda keluar dengan imej Gandalf ini daripada Lord of the Rings (kepala anjing manual). Untuk mengetahui lebih lanjut tentang Laravel Gates (pemintas), pastikan anda melawati dokumentasi kebenaran Laravel. Alamat asal bahasa Inggeris: https://devdojo.com/tnylea/laravel-gates Alamat terjemahan: https://learnku.com/laravel/t/67585 [Cadangan berkaitan: tutorial video laravel]
Atas ialah kandungan terperinci Mari kita bincangkan tentang pemintas (Gates) di Laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!