Rumah >pembangunan bahagian belakang >tutorial php >Cara membuat pengawal pengesahan tersuai di laravel

Cara membuat pengawal pengesahan tersuai di laravel

Lisa Kudrow
Lisa Kudrowasal
2025-03-05 10:02:09700semak imbas

How to Create a Custom Authentication Guard in Laravel

Artikel ini akan meneroka sistem pengesahan rangka kerja Laravel secara mendalam, memberi tumpuan kepada cara membuat pengawal pengesahan tersuai dengan memperluaskan sistem pengesahan teras.

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

Inti sistem pengesahan Laravel terdiri daripada dua elemen - pengawal dan penyedia.

penjaga

Pengawal boleh difahami sebagai penyedia logik yang digunakan untuk mengenal pasti pengguna yang disahkan. Teras Laravel menyediakan pengawal yang berbeza seperti Sesi dan Token. Pengawal Sesi mengekalkan status pengguna dalam setiap permintaan melalui kuki, sementara pengawal token mengesahkan pengguna dengan memeriksa token yang sah dalam setiap permintaan.

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

Jika pengawal mentakrifkan logik untuk pengesahan, pembekal pengesahan bertanggungjawab untuk mendapatkan pengguna dari penyimpanan backend. Sekiranya Pengawal memerlukan pengguna mesti disahkan terhadap penyimpanan backend, pelaksanaan pengguna carian dimasukkan ke dalam penyedia pengesahan.

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

mari kita lihat dengan cepat senarai fail yang akan dilaksanakan dalam artikel ini.

  • config/auth.php : Ini adalah fail konfigurasi pengesahan di mana kami akan menambah entri untuk pengawal tersuai.
  • config/mongo.php : Fail yang mengandungi konfigurasi MongoDB.
  • App/Services/Contracts/NOSQLServiceInterface.php : antara muka yang dilaksanakan oleh kelas pangkalan data Mongo Custom kami.
  • app/pangkalan data/mongodatabase.php : Kelas pangkalan data utama yang berinteraksi dengan MongoDB.
  • App/Models/Auth/user.php : Kelas model pengguna yang melaksanakan kontrak yang boleh dikesan.
  • app/extensions/mongouserprovider.php : pelaksanaan penyedia pengesahan.
  • App/Services/Auth/jsonguard.php : Pelaksanaan Pemandu Pengawal Pengesahan.
  • App/Penyedia/AuthServiceProvider.php : Kami akan gunakan untuk menambah fail sedia ada yang terikat pada bekas perkhidmatan.
  • App/Http/Controllers/Mongocontroller.php : Fail pengawal demo yang akan kami laksanakan untuk menguji pengawal tersuai.

Jika senarai fail tidak jelas pada masa ini, jangan risau, kami akan membincangkan setiap fail secara terperinci semasa penjelasan.

pelaksanaan mendalam

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.

Tetapkan penyedia pengesahan

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.

Sebaliknya, cuba sesuatu yang serupa dengan

, 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.

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn