Teras Laravel menyediakan sistem pengesahan yang kuat yang membolehkan pengesahan asas dapat dilaksanakan dengan mudah. Hanya jalankan beberapa arahan tukang untuk membina perancah sistem pengesahan.
Di samping itu, sistem ini direka untuk membolehkan lanjutan dan penyisipan penyesuai pengesahan tersuai. Artikel ini akan membincangkannya secara terperinci. Sebelum kita menyelam ke dalam pelaksanaan pengawal pengesahan tersuai, kita akan terlebih dahulu membincangkan unsur -unsur asas Sistem Pengesahan Laravel - Pengawal dan Penyedia.
Elemen Teras: Pengawal dan Penyedia
penjaga
Oleh itu, Pengawal mentakrifkan logik pengesahan dan tidak selalu dilaksanakan dengan mengambil kelayakan yang sah dari backend. Anda boleh melaksanakan pengawal yang hanya memeriksa kandungan tertentu dalam pengepala permintaan dan mengesahkan pengguna berdasarkan kandungan ini.
Pengawal akan dilaksanakan kemudian dalam artikel ini, yang memeriksa parameter JSON tertentu dalam tajuk permintaan dan mengambil pengguna yang sah dari backend MongoDB.
Pembekal
Laravel dilengkapi dengan dua penyedia pengesahan lalai - pangkalan data dan fasih. Pembekal pengesahan pangkalan data mengambil kelayakan pengguna secara langsung dari penyimpanan backend, sementara Eloquent menyediakan lapisan abstraksi untuk melakukan ini.
Dalam contoh kami, kami akan melaksanakan pembekal pengesahan MongoDB yang mengambil kelayakan pengguna dari backend MongoDB.
di atas adalah pengenalan asas kepada pengawal dan penyedia dalam sistem pengesahan Laravel. Bermula dari bahagian seterusnya, kami akan memberi tumpuan kepada pembangunan pengawal dan penyedia pengesahan tersuai!
Gambaran Keseluruhan Tetapan Fail
Jika senarai fail tidak jelas pada masa ini, jangan risau, kami akan membincangkan setiap fail secara terperinci semasa penjelasan.
Dalam bahagian ini, kami secara beransur -ansur akan menerangkan pelaksanaan fail yang diperlukan.
Pertama sekali, kita perlu membiarkan Laravel tahu tentang pengawal tersuai kami. Sila tambahkan butiran pengawal tersuai dalam fail config/auth.php seperti yang ditunjukkan di bawah.
<code>...<br>...<br>'guards' => [<br> 'web' => [<br> 'driver' => 'session',<br> 'provider' => 'users',<br> ],<br><br> 'api' => [<br> 'driver' => 'token',<br> 'provider' => 'users',<br> 'hash' => false,<br> ],<br><br> 'custom' => [<br> 'driver' => 'json',<br> 'provider' => 'mongo',<br> ],<br>],<br>...<br>...<br></code>
Seperti yang anda lihat, kami telah menambah pengawal tersuai kami di bahagian Penyedia.
<code>...<br>...<br>'providers' => [<br> 'users' => [<br> 'driver' => 'eloquent',<br> 'model' => App\User::class,<br> ],<br> 'mongo' => [<br> 'driver' => 'mongo'<br> ],<br><br> // 'users' => [<br> // 'driver' => 'database',<br> // 'table' => 'users',<br> // ],<br>],<br>...<br>...<br></code>
Kami menambah kemasukan penyedia kami ke model pengguna di web.
Menurut piawaian sistem pengesahan, kita perlu melaksanakan model pengguna.
Seperti yang disebutkan sebelumnya, sistem pengesahan Laravel terdiri daripada dua elemen - pengawal dan penyedia.
Dalam bahagian ini, kami akan membuat pembekal pengesahan yang bertanggungjawab untuk mendapatkan pengguna dari backend.
Sila buat fail app/extensions/mongouserprovider.php , kandungannya adalah seperti berikut.
<?php <br?>// app/Extensions/MongoUserProvider.php<br></br>namespace App\Extensions;<br></br><br></br>use Illuminate\Support\Str;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class MongoUserProvider implements UserProvider<br></br>{<br></br> /**<br></br> * The Mongo User Model<br></br> */<br></br> private $model;<br></br><br></br> /**<br></br> * Create a new mongo user provider.<br></br> *<br></br> * @return \Illuminate\Contracts\Auth\Authenticatable|null<br></br> * @return void<br></br> */<br></br> public function __construct(\App\Models\Auth\User $userModel)<br></br> {<br></br> $this->model = $userModel;<br> }<br><br> /**<br> * Retrieve a user by the given credentials.<br> *<br> * @param array $credentials<br> * @return \Illuminate\Contracts\Auth\Authenticatable|null<br> */<br> public function retrieveByCredentials(array $credentials)<br> {<br> if (empty($credentials)) {<br> return;<br> }<br><br> $user = $this->model->fetchUserByCredentials(['username' => $credentials['username']]);<br><br> return $user;<br> }<br><br> /**<br> * Validate a user against the given credentials.<br> *<br> * @param \Illuminate\Contracts\Auth\Authenticatable $user<br> * @param array $credentials Request credentials<br> * @return bool<br> */<br> public function validateCredentials(Authenticatable $user, Array $credentials)<br> {<br> return ($credentials['username'] == $user->getAuthIdentifier() &&<br> md5($credentials['password']) == $user->getAuthPassword());<br> }<br><br> public function retrieveById($identifier) {}<br><br> public function retrieveByToken($identifier, $token) {}<br><br> public function updateRememberToken(Authenticatable $user, $token) {}<br>}<br>
Begitu juga, anda perlu memastikan bahawa pembekal tersuai mesti melaksanakan retrieveByCredentials
dan kelas model pengguna yang dibincangkan sebelumnya. Sebaliknya, parameter permintaan jsondata
hendaklah mengandungi rentetan kelayakan JSON yang dikodkan.
Dalam bahagian ini, kami akan membuat pengawal yang berinteraksi dengan penyedia pengesahan yang dibuat di bahagian sebelumnya.
Sila buat fail aplikasi/perkhidmatan/auth/jsonguard.php , kandungannya adalah seperti berikut.
<?php <br?>// app/Services/Auth/JsonGuard.php<br></br>namespace App\Services\Auth;<br></br><br></br>use Illuminate\Http\Request;<br></br>use Illuminate\Contracts\Auth\Guard;<br></br>use Illuminate\Contracts\Auth\UserProvider;<br></br>use GuzzleHttp\json_decode;<br></br>use phpDocumentor\Reflection\Types\Array_;<br></br>use Illuminate\Contracts\Auth\Authenticatable;<br></br><br></br>class JsonGuard implements Guard<br></br>{<br></br> protected $request;<br></br> protected $provider;<br></br> protected $user;<br></br><br></br> /**<br></br> * Create a new authentication guard.<br></br> *<br></br> * @param \Illuminate\Contracts\Auth\UserProvider $provider<br></br> * @param \Illuminate\Http\Request $request<br></br> * @return void<br></br> */<br></br> public function __construct(UserProvider $provider, Request $request)<br></br> {<br></br> $this->request = $request;<br> $this->provider = $provider;<br> $this->user = NULL;<br> }<br><br> /**<br> * Determine if the current user is authenticated.<br> *<br> * @return bool<br> */<br> public function check()<br> {<br> return ! is_null($this->user());<br> }<br><br> /**<br> * Determine if the current user is a guest.<br> *<br> * @return bool<br> */<br> public function guest()<br> {<br> return ! $this->check();<br> }<br><br> /**<br> * Get the currently authenticated user.<br> *<br> * @return \Illuminate\Contracts\Auth\Authenticatable|null<br> */<br> public function user()<br> {<br> if (! is_null($this->user)) {<br> return $this->user;<br> }<br> }<br><br> /**<br> * Get the JSON params from the current request<br> *<br> * @return string<br> */<br> public function getJsonParams()<br> {<br> $jsondata = $this->request->query('jsondata');<br><br> return (!empty($jsondata) ? json_decode($jsondata, TRUE) : NULL);<br> }<br><br> /**<br> * Get the ID for the currently authenticated user.<br> *<br> * @return string|null<br> */<br> public function id()<br> {<br> if ($user = $this->user()) {<br> return $this->user()->getAuthIdentifier();<br> }<br> }<br><br> /**<br> * Validate a user's credentials.<br> *<br> * @return bool<br> */<br> public function validate(Array $credentials=[])<br> {<br> if (empty($credentials['username']) || empty($credentials['password'])) {<br> if (!$credentials=$this->getJsonParams()) {<br> return false;<br> }<br> }<br><br> $user = $this->provider->retrieveByCredentials($credentials);<br><br> if (! is_null($user) && $this->provider->validateCredentials($user, $credentials)) {<br> $this->setUser($user);<br><br> return true;<br> } else {<br> return false;<br> }<br> }<br><br> /**<br> * Set the current user.<br> *<br> * @param Array $user User info<br> * @return void<br> */<br> public function setUser(Authenticatable $user)<br> {<br> $this->user = $user;<br> return $this;<br> }<br>}<br>
Pertama, kelas kita perlu melaksanakan mongo
. Ingatlah bahawa kunci mencerminkan tetapan yang sebelum ini ditambah dalam penyesuai pelaksanaan CouchDB. Dalam kes ini, mereka hanya perlu menambah pengikatan yang sepadan dalam kaedah log masuk, yang memerlukan pelaksanaan mesej yang tidak dibenarkan.
, jika pengguna wujud dalam pangkalan data anda, anda harus mengembalikan mesej http://your-laravel-site/custom/mongo/login?jsondata={"username":"admin","password":"admin"}
. success
Perhatikan bahawa ini hanya satu contoh untuk menunjukkan bagaimana pengawal tersuai berfungsi. Untuk ciri -ciri seperti log masuk, anda harus melaksanakan penyelesaian yang bodoh. Malah, saya hanya memberi gambaran tentang proses pengesahan; anda bertanggungjawab untuk membina penyelesaian yang kuat dan selamat untuk permohonan anda.
Perjalanan hari ini berakhir di sini, dan semoga saya akan membawa kandungan yang lebih berguna tidak lama lagi.
Rangka Kerja Laravel menyediakan sistem pengesahan yang kuat di teras, dan boleh dilanjutkan jika anda ingin melaksanakan sistem pengesahan tersuai. Ini adalah topik artikel ini: melaksanakan pengawal tersuai dan memasukkannya ke dalam aliran kerja pengesahan Laravel.
Dalam proses ini, kami membangunkan sistem yang mengesahkan pengguna berdasarkan muatan JSON yang diminta dan sepadan dengan pangkalan data MongoDB. Untuk mencapai matlamat ini, kami akhirnya membuat pengawal tersuai dan pelaksanaan pembekal tersuai.
Saya harap latihan ini akan memberi anda pemahaman yang mendalam tentang proses pengesahan Laravel, dan sekarang anda harus lebih yakin dengan cara ia berfungsi secara dalaman.
Bagi mereka yang baru bermula dengan Laravel atau ingin memperluaskan pengetahuan, laman web, atau aplikasi mereka melalui sambungan, terdapat banyak sumber yang tersedia di Envato Market untuk belajar.
Atas ialah kandungan terperinci Cara membuat pengawal pengesahan tersuai di laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!