我想创建一个自定义中间件,只有当用户经过身份验证并且电子邮件是某个电子邮件才能访问 /admin 页面。
虽然,当我指定自定义路由然后重定向时,它总是说重定向太多..
简短说明。
我的中间件称为“admin.verify”
路由文件会自动加载,如果我重定向('/home'),它会自动运行我的中间件,这就是为什么我猜测它经常重定向到主页。
路线文件:
Route::get('/admin', 'AdminController@index')->name('admin.index');
管理员控制器:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class AdminController extends Controller
{
public function __construct(){
$this->middleware(['auth', 'admin.verify']);
}
public function index(){
return view('admin.test');
}
}
中间件:
public function handle($request, Closure $next)
{
if (Auth::check() && Auth::User()->email == '[email protected]') {
return $next($request);
} else {
return redirect()->route('home');
}
我的家乡路线:
GET|HEAD | home | home| App\Http\Controllers\HomeController@index | web,auth
家庭控制器:
class HomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth');
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('home');
}
}
正如评论中所讨论的,您已在全局中间件堆栈下注册了它,该堆栈在每个请求上运行。 这意味着,如果您未满足第一个条件,您将不断重定向到“home”,因为该中间件将在“home”(以及所有其他)路由上运行。 所以你会去:
/some/page ... condition failed: redirect 'home'
/home ... condition failed: redirect 'home'
/home ... condition failed: redirect 'home' ... and so on
在 app/Http/Kernel.php 中,您有三个部分:
$middleware,全局中间件堆栈(在每个请求上运行)
$middlewareGroup,在该组的每个请求(Web、API 等)上运行。 routes/web.php 中的任何内容都将通过“web”组运行。
$routeMiddleware,可以在特定路由上启用的路由特定中间件。
如果您在 Laravel 11 中遇到过这种情况。
#your middleware class
class EnsureUserIsLogin
{
function handle(Request $request, Closure $next): Response
{
if ($_SERVER['REQUEST_METHOD']!='OPTIONS') {
if (!Auth::check()) {
return redirect('/');
}
}
return $next($request);
}
}
确保在目标路由中排除中间件。
Route::get('/', function () {
return Inertia::render('Login');
})->withoutMiddleware([EnsureUserIsLogin::class]);