Laravel 9 家电服务项目2-管理员、服务提供商和客户身份验证

111 阅读2分钟

在Laravel 9中使用jetstream认证?

composer require laravel/jetstream

php artisan jetstream:install livewire

npm install && npm run dev
编写迁移文件

在 Database下Migrations的2014_10_12_000000_create_users_table.php 中增加一个字段“$table->string('utype')->default('CST');”

public function up(): void
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->foreignId('current_team_id')->nullable();
        $table->string('profile_photo_path', 2048)->nullable();
        $table->string('utype')->default('CST');
        $table->timestamps();
    });
}

数据库迁移:

php artisan migrate

resources/views/layouts/base.blade.php模版添加以下:

@if(Route::has('login'))
 @auth
     @if(Auth::user()->utype=== 'ADM')
         <!--管理员链接-->
         <li class="login-form"><a href="#" title="Register">本人账户 (Admin)</a>
             <ul class="drop-down one-column hover-fade">
                 <li><a href="{{ route('admin.dashboard') }}">DASBOARD</a></li>
                 <li><a href="{{route('logout')}}"
                        onclick="event.preventDefault(); document.getElementById('logout-form').submit();">退出</a>
                 </li>
             </ul>
         </li>
     @elseif(Auth::user()->utype=== 'SVP')
         <!--服务提供商链接-->
         <li class="login-form"><a href="#" title="Register">本人账户 (S provider)</a>
             <ul class="drop-down one-column hover-fade">
                 <li><a href="{{ route('sprovider.dashboard') }}">DASBOARD</a></li>
                 <li><a href="{{route('logout')}}"
                        onclick="event.preventDefault(); document.getElementById('logout-form').submit();">退出</a>
                 </li>
             </ul>
         </li>
     @else
         <!--客户链接-->
         <li class="login-form"><a href="#" title="Register">本人账户 (Customer)</a>
             <ul class="drop-down one-column hover-fade">
                 <li><a href="{{ route('customer.dashboard') }}">DASBOARD</a></li>
                 <li><a href="{{route('logout')}}"
                        onclick="event.preventDefault(); document.getElementById('logout-form').submit();">退出</a>
                 </li>
             </ul>
         </li>
     @endif
     <form id="logout-form" method="Post" action="{{route('logout')}}" style="display: none">
         @csrf
     </form>
 @else
     <li class="login-form"><a href="{{ route('register') }}" title="Register">注册</a></li>
     <li class="login-form"><a href="{{ route('login') }}" title="Login">登录</a></li>
 @endif
 <li class="search-bar">
 </li>
@endif

注册管理员、服务提供商和客户账号

数据库依次修改一下字段 utype 中的,管理员为ADM,服务提供商为SVP,客户为CST image.png

3.在Laravel 8中创建中间件?

php artisan make:middleware AuthAdmin

打开App\Http\Middleware下的AuthAdmin 确定当前用户是否已通过身份验证

use Illuminate\Support\Facades\Auth;

public function handle(Request $request, Closure $next): Response
{
    if (Auth::user()->utype === 'ADM') {  // 如果该账号是管理员就进入
        return $next($request);
    } else {
        session()->flush();
        return redirect()->route('login'); // 否则重定向登录页面
    }
}
php artisan make:middleware AuthSprovider

打开App\Http\Middleware下的AuthSprovider 确定当前用户是否已通过身份验证

use Illuminate\Support\Facades\Auth;

public function handle(Request $request, Closure $next)
{
    if (Auth::user()->utype === 'SVP') {  // 如果该账号是服务提供商就进入
        return $next($request);
    } else {
        session()->flush();
        return redirect()->route('login'); // 否则重定向登录页面
    }
}

注册中间件,在App\Http\Kernel类中

protected $routeMiddleware = [
    'authadmin'=> \App\Http\Middleware\AuthAdmin::class,
    'authsprovider'=> \App\Http\Middleware\AuthSprovider::class,
    ...
    ...
    ...
    ...
];

在 Providers\RouteServiceProvider,修改一下跳转首页

public const HOME = '/';

创建管理员和服务提供商以及客户的前端模版文件

php artisan make:livewire Admin/AdminDashboardComponent

php artisan make:livewire Sprovider/SproviderDashboardComponent

php artisan make:livewire Customer/CustomerDashboardComponent

控制器加载模版

管理员控制器,App\Http\Livewire\Admin\AdminDashboardComponent

public function render()
{
    return view('livewire.admin.admin-dashboard-component')->layout('layouts.base');
}

客户控制器 App\Http\Livewire\Admin\CustomerDashboardComponent

public function render()
{
    return view('livewire.customer.customer-dashboard-component')->layout('layouts.base');
}

客服提供商控制器 App\Http\Livewire\Admin\SproviderDashboardComponent

public function render()
{
    return view('livewire.sprovider.sprovider-dashboard-component')->layout('layouts.base');
}

在Laravel 8中创建路由组?

// 首页
Route::get('/', \App\Http\Livewire\HomeComponent::class)->name('home');

// 客户
Route::middleware([
    'auth:sanctum',
    config('jetstream.auth_session'),
    'verified'
])->group(function () {
    Route::get('/customer/dashboard', \App\Http\Livewire\Customer\CustomerDashboardComponent::class)
        ->name('customer.dashboard');
});

// 服务提供商
Route::middleware([
    'auth:sanctum',
    config('jetstream.auth_session'),
    'verified',
    'authsprovider'
])->group(function () {
    Route::get('/sprovider/dashboard', \App\Http\Livewire\Sprovider\SproviderDashboardComponent::class)
        ->name('sprovider.dashboard');
});

// 管理员
Route::middleware([
    'auth:sanctum',
    config('jetstream.auth_session'),
    'verified',
    'authadmin'
])->group(function () {
    Route::get('/admin/dashboard', \App\Http\Livewire\Admin\AdminDashboardComponent::class)
        ->name('admin.dashboard');
});

前端模版加载路由跳转

@if(Route::has('login'))
    @auth
        @if(Auth::user()->utype=== 'ADM')
            <!--管理员链接-->
            <li class="login-form"><a href="#" title="Register">本人账户 (Admin)</a>
                <ul class="drop-down one-column hover-fade">
                    <li><a href="{{ route('admin.dashboard') }}">DASBOARD</a></li>
                    <li><a href="{{route('logout')}}"
                           onclick="event.preventDefault(); document.getElementById('logout-form').submit();">退出</a>
                    </li>
                </ul>
            </li>
        @elseif(Auth::user()->utype=== 'SVP')
            <!--服务提供商链接-->
            <li class="login-form"><a href="#" title="Register">本人账户 (S provider)</a>
                <ul class="drop-down one-column hover-fade">
                    <li><a href="{{ route('sprovider.dashboard') }}">DASBOARD</a></li>
                    <li><a href="{{route('logout')}}"
                           onclick="event.preventDefault(); document.getElementById('logout-form').submit();">退出</a>
                    </li>
                </ul>
            </li>
        @else
            <!--客户链接-->
            <li class="login-form"><a href="#" title="Register">本人账户 (Customer)</a>
                <ul class="drop-down one-column hover-fade">
                    <li><a href="{{ route('customer.dashboard') }}">DASBOARD</a></li>
                    <li><a href="{{route('logout')}}"
                           onclick="event.preventDefault(); document.getElementById('logout-form').submit();">退出</a>
                    </li>
                </ul>
            </li>
        @endif
        <form id="logout-form" method="Post" action="{{route('logout')}}"style="display: none">
            @csrf
        </form>
    @else
        <li class="login-form"><a href="{{ route('register') }}" title="Register">注册</a></li>
        <li class="login-form"><a href="{{ route('login') }}" title="Login">登录</a></li>
    @endif
    <li class="search-bar">
    </li>
@endif