Laravel 如何使用@auth 和@guest 进行多重身份验证

Laravel how to use @auth and @guest with multi authentication

我正在尝试在 Laravel 项目中进行多重身份验证

我会制作四个 table,每个 table 都有自己的身份验证系统

1 - 客人

2 - 讲师

3 - 主管

4 - 管理员

我从管理员 table 开始,创建 table 并像这样修改 auth.php 配置文件

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

    'admin' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],

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

并将其添加到提供程序数组中

'admins' => [
    'driver' => 'eloquent',
    'model' => App\Models\Admin::class,
]

这是 AdminController

<?php

namespace App\Http\Controllers;

use App\Models\Admin;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;

class AdminController extends Controller
{
    public function signup() {
        return view('auth/admin/signup');
    }

    public function handleSignup(Request $request) {
        $request->validate([
            'account' => 'required|string|max:100|min:3',
            'password' => 'required|string|max:100|min:8',
            'country' => 'required|string|max:100',
            'phone' => 'required|string|max:11',
            'visa' => 'nullable|string|max:19|min:10',
        ]);

        $admin = Admin::create([
            'account' => $request->account,
            'password' => Hash::make($request->password),
            'country' => $request->country,
            'phone' => $request->phone,
            'visa' => $request->visa
        ]);

        Auth::login($admin);

        return redirect(route('home'));
    }

    public function signin() {
        return view('auth/admin/signin');
    }

    public function handleSignin(Request $request) {
        $request->validate([
            'account' => 'required|string|max:100|min:3',
            'password' => 'required|string|max:100|min:8',
        ]);

        $is_login = Auth::guard('admin')->attempt(['account' => $request->account, 'password' => $request->password]);

        if (!$is_login) {
            return redirect(route('auth.admin.signin'));
        }

        return redirect(route('home'));
    }

    public function signout() {
        Auth::guard('admin')->logout();

        return redirect(route('home'));
    }
}

在 blade 中,我需要隐藏已登录用户的登录和注册按钮,只显示注销,所以我做了这个

@guest
    <li class="nav-item">
            <a class="nav-link" href="{{ route('auth.signin') }}">Login</a>
    </li>
    <li class="nav-item">
            <a class="nav-link" href="{{ route('auth.signup') }}">Sign Up</a>
    </li>
@endguest
@auth
    <li class="nav-item">
        <a class="nav-link" href="{{ route('auth.signout') }}">Logout</a>
    </li>
@endauth

但是当我登录时,它会正确地重定向我的主页,但我仍然可以看到登录和注册按钮,但注销按钮没有显示

谁能帮我解决这个问题?

首先,例如,您可以像这样检查管理员的猜测;

@guest('admin')
    <li class="nav-item">
            <a class="nav-link" href="{{ route('auth.signin') }}">Login</a>
    </li>
    <li class="nav-item">
            <a class="nav-link" href="{{ route('auth.signup') }}">Sign Up</a>
    </li>
@endguest

但我推荐这个,你可以检查每个守卫并包括那个守卫的部分;

@if (Auth::guard('admin')->check())
  @include('admin.auth-links')
@elseif(Auth::guard('supervisor')->check())
  @include('supervisor.auth-links')
@elseif(Auth::guard('instructor')->check())
  @include('instructor.auth-links')
@else
  @include('auth-links')
@endif

// Logout link can be single endpoint which logouts multiple guards.