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.
我正在尝试在 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.