Laravel多表身份验证
#网络开发人员 #php #laravel #authentication

身份验证是任何Web应用程序的重要组成部分,Laravel可以轻松使用其内置身份验证功能实现。但是,如果您有多种用户类型,每个用户类型在数据库中都有自己的表格怎么办?在这种情况下,您需要实现多桌身份验证,以确保对正确的用户进行身份验证并允许正确访问该应用程序。在本文中,我将引导您完成Laravel中实施多桌身份验证的步骤,以便您可以保护应用程序并为用户提供最佳体验。准备潜入Laravel身份验证的世界!

我们吗?我们走吧。

我开始假设您知道如何安装新的Laravel应用程序,并且已经安装了一个应用程序。就是说,让我们继续。

Laravel随附默认用户表,假设这是应用程序默认用户的表。您想要另一个用于管理用户的表。

楷模)

首先,我们为此CAS Admins中的新用户创建模型。在您的情况下,可能是老师和学生。

php artisan make:model Admin/Admin

现在,您已经创建了管理模型,将其放入并复制以下代码。值得通知的特征使在这些模型上使用Laravel默认通知是可能的。

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticatable
{
    use HasFactory, Notifiable;
    protected $guard = 'admin';
}    

配置

Laravel具有包含所有配置文件的配置文件夹。在此文件中,打开auth.php文件并粘贴以下代码,我们在其中为管理员创建身份验证规则

在auth.php config

'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
 'admin'=>[
        'driver'=>'eloquent',
        'model'=>App\Models\Admin\Admin::class,
     ],

  'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
        'admin'=>[
           'driver'=>'session',
           'provider'=>'admins',
        ],
    ],

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\Models\User::class,
        ],

        'admins'=>[
            'driver'=>'eloquent',
            'model'=>App\Models\Admin\Admin::class,
         ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
            'throttle' => 60,
        ],
        'admins'=>[
            'driver'=>'eloquent',
            'model'=>App\Models\Admin\Admin::class,
        ],
    ],

中间件

现在导航到Middlware文件夹并打开authentication.php文件。这是重定向用户尝试访问守卫页面时未经身份验证的文件。请注意,我在文件中评论了默认代码。

middelware authenticate.php

  // foreach ($guards as $guard) {
        //     if (Auth::guard($guard)->check()) {
        //         return redirect(RouteServiceProvider::HOME);
        //     }
        // }


        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {

                if($guard === 'admin'){
                    return redirect()->route('admin.home');
                }
                return redirect()->route('user.home');
                // return redirect(RouteServiceProvider::HOME);
            }
        }
    if (! $request->expectsJson()) {
            if($request->routeIs('admin.*')){
                return route('admin.login');
            }
            return route('login');
        }

在同一中间件文件夹中,打开以下文件。它是负责基于其身份验证的后卫重新验证用户的中间件。

在redirectifauthenticated.php中

  // foreach ($guards as $guard) {
        //     if (Auth::guard($guard)->check()) {
        //         return redirect(RouteServiceProvider::HOME);
        //     }
        // }


        foreach ($guards as $guard) {
            if (Auth::guard($guard)->check()) {

                if($guard === 'admin'){
                    return redirect()->route('admin.home');
                }
                return redirect()->route('user.home');
                // return redirect(RouteServiceProvider::HOME);
            }
        }

Admin Auth Controller

在这里,我们将创建一个控制器来处理此类用户的身份验证。

我们首先创建一个控制器来处理管理员登录。

php artisan make:controller Auth/AdminAuthController

控制器内部

public function __construct()
{
     Auth::setDefaultDriver('admin');
     config(['auth.defaults.passwords' => 'admins']); 
}

public function login()
{
     return view('admin_auth.adminlogin');
}

   public function logoutAdmin(Request $request)
    {
        Auth::guard('admin')->logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return redirect('/');
    }

public function store(Request $request)
{
     $request->validate([
         'email'=>'required|string',
         'password'=>'required|min:5|max:30'
      ]);


    if (Auth::guard('admin')->attempt(['email' => $request- 
    >identifier, 'password' => $request->password])|| 
     Auth::guard('admin')->attempt(['username' => $request>identifier, 'password' => $request->password])) {
            // Authentication was successful...
            return redirect()->route('panel');
     }
   else{
       return redirect()->route('admin.login')- 
         >with('fail','Incorrect credentials');
     }
    }

路线

现在让使用此组用户的创建身份验证逻辑(管理员)。

Route::get('/admin/login', [AdminAuthController::class, 'login'])->name('admin.login');
Route::get('/admin/login', [AdminAuthController::class, 'store'])->name('admin.login.store');
Route::post('/admin/logout', [AdminAuthController::class, 'logoutAdmin'])->name('admin.logout');

注意这部分。您将需要更多通向仪表板或任何其他受保护页面的路线。 下面是这种路线的Exampme。注意中间软件使用情况验证:管理员。非常重要。

Route::get('/panel', [AdminPagesController::class, 'panel_home'])->name('panel')->middleware('auth:admin');

登录HTML

此时,让我们创建blade文件或html文件以登录管理登录页面。资源\ views \ admin_auth.blade.php
请注意我们将此表格提交给的位置。

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
  </head>
  <body>
    <!-- <h1>Hello, world!</h1> -->
    <main class="container mt-5">
    <form method="POST" action="{{route('admin.login.store')}}">
        @csrf 
        <div class="form-group">
            <h3 class="text-center">Admin Login</h3>
        </div>
        <div class="mb-3">
            <label for="exampleInputEmail1" class="form-label">Email or Username</label>
            <input type="text" class="form-control" name="identifier" id="exampleInputEmail1" aria-describedby="emailHelp">
            <div id="emailHelp" class="form-text">We'll never share your email with anyone else.</div>
        </div>
        <div class="mb-3">
            <label for="exampleInputPassword1" class="form-label">Password</label>
            <input type="password" name="password" class="form-control" id="exampleInputPassword1">
        </div>
        <div class="mb-3 form-check">
            <input type="checkbox" name="remember" class="form-check-input" id="exampleCheck1">
            <label class="form-check-label" for="exampleCheck1">Check me out</label>
        </div>
        <button type="submit" style="float:right;" class="btn btn-primary">Submit</button>
    </form>
    </main>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
  </body>
</html>

移民

现在让我们为此新用户创建表或迁移-Admins。运行命令

php artisan make:migration create_admins_table 

在迁移文件中,复制并粘贴下面的代码

     $table->string('name');
     $table->string('username')->nullable();
     $table->string('email')->unique();
     $table->timestamp('email_verified_at')->nullable();
     $table->string('password');
     // $table->enum('admin_typ', ['admin'])->nullable();
     $table->rememberToken(); 

工厂和播种机

现在让我们快速填充数据库。我们首先为管理员模型和播种机文件制作模型工厂。

php artisan make:factory Admin/AdminFactory    
php artisan make:seeder AdminSeeder

在工厂定义方法中

  return [
            'name' => fake()->name(),
            'username'=>fake()->userName(),
            'email' => fake()->unique()->safeEmail(),
            'email_verified_at' => now(),
            'password'=>'$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];

在播种机文件中,在运行方法中

    \App\Models\Admin\Admin::factory(5)->create();

        \App\Models\Admin\Admin::factory()->create([
            'name' => 'Test Admin',
            'username'=>'admin',
            'email' => 'admin@admin.com',
        ]);

接下来运行播种机命令以填充数据库。

php artisan db:seed --class=AdminSeeder

记住为受保护的页面创建HTML刀片。

就是这样。启动您的Laravel应用程序,然后尝试在管理员登录页面上登录。

我是Vincent Ikechukwu,完整的堆栈Web开发人员和软件工程师。通过下面的链接在社交媒体上与我联系。

如果您遇到麻烦,请发表评论或在我的社交媒体上打招呼。