如何解决 Laravel 路由和中间件的重定向循环问题?

问题描述 投票:0回答:1

if (!Auth::guard('admin')->check() && !$request->routeIs('admin.login')) {return redirect()->route('admin.login');}

尝试将其插入 ChatGPT,并更改了 web.php 中的一些内容:

Route::get('/admin/login', [AdminController::class, 'showLoginForm'])->name('admin.login');
Route::post('/admin/login', [AdminController::class, 'login'])->name('admin.login.post');

Route::middleware([RedirectIfAdminExists::class])->group(function () {
    Route::get('/admin/login', [AdminController::class, 'showLoginForm'])->name('admin.login')->withoutMiddleware([RedirectIfAdminExists::class]);
    Route::get('/admin', [AdminController::class, 'index'])->name('admin.index');
    Route::get('/admin/create', [AdminController::class, 'create'])->name('admin.create');
    Route::post('/admin', [AdminController::class, 'store'])->name('admin.store');
    Route::get('/admin/{admin}', [AdminController::class, 'show'])->name('admin.show');
    Route::get('/admin/{admin}/edit', [AdminController::class, 'edit'])->name('admin.edit');
    Route::put('/admin/{admin}', [AdminController::class, 'update'])->name('admin.update');
    Route::delete('/admin/{admin}', [AdminController::class, 'destroy'])->name('admin.destroy');
});

RedirectIfAdminExists
中间件旨在如果用户未以管理员身份登录并尝试访问特定于管理员的路由,则重定向到管理员登录页面。但是,此设置会导致重定向循环,特别是在管理登录页面本身上。

我尝试通过从中间件组内的管理员登录路由中排除

RedirectIfAdminExists
中间件来解决该问题,如上所示。虽然这种调整似乎可以防止重定向循环,但我不确定这是否是正确的方法或者是否有更好的解决方案。

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;
use Illuminate\Http\Request;

class RedirectIfAdminExists
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        // Check if the user is not logged in as an admin and the current route is not 'admin.login'
        if (!Auth::guard('admin')->check() && !$request->routeIs('admin.login')) {
            return redirect()->route('admin.login');
        }

        return $next($request);
    }

}

我的 AdminController 功能:

public function index()
    {
        $admins = Admin::all();
        $users = User::all();
        $images = Image::all();
        $products = Product::all();
        $sellers = Seller::all();
        $orders = Order::all();
        $orderItems = OrderItem::all();
        $carts = Cart::all();
        $cartItems = CartItem::all();
        $reviews = Review::all();
        $categories = Category::all();

        return view('admin.index', compact('admins', 'users', 'images', 'products', 'sellers', 'orders', 'orderItems', 'carts', 'cartItems', 'reviews', 'categories'));
    }

    public function create()
    {
        return view('admin.create');
    }

    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'password' => ['required', 'min:8', 'regex:/^[A-Z]{2}\d{4}---$/'],
        ], [
            'password.regex' => 'Password creation does not meet criteria',
        ]);

        Admin::create([
            'name' => $request->name,
            'password' => Hash::make($request->password),
        ]);

        return redirect()->route('admin.index')->with('success', 'Admin created successfully.');
    }

    public function show($id)
    {
        $admin = Admin::findOrFail($id);
        return view('admin.show', compact('admin'));
    }

    public function showLoginForm()
    {
        return view('admin.login');
    }

    public function login(Request $request)
    {
        $credentials = $request->only('name', 'password');

        if (Auth::guard('admin')->attempt($credentials)) {
            return redirect()->route('admin.index');
        } else {
            return back()->withErrors([
                'name' => 'The provided credentials do not match our records.',
            ]);
        }
    }
laravel loops http-redirect admin
1个回答
0
投票

您已定义两次“admin.login”路由。 一种没有任何中间件,一种位于 RedirectIfAdminExists 分组路由中。 只要删除组内的一个,你就得到你想要的了。

如果路由组里只有一个中间件,那么只需设置这个中间件不应该有组外的路由即可

© www.soinside.com 2019 - 2024. All rights reserved.