You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10自定义中间件中如何返回带错误信息的重定向?

解决方案

问题分析

你遇到的“无法访问网站”大概率是循环重定向导致的:当用户权限不匹配时,若尝试重定向回上一页,但上一页同样受CheckUserRole中间件保护,就会陷入无限循环,浏览器因此提示无法访问。另外你的角色查询逻辑也可以简化,减少不必要的操作。

修正后的代码

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Symfony\Component\HttpFoundation\Response;

class CheckUserRole
{
    public function handle(Request $request, Closure $next, $role): Response
    {
        // 先判断用户是否登录
        if (!Auth::check()) {
            // 未登录直接重定向到登录页,附带来源URL
            return redirect()->route('login')->with('error', '请先登录');
        }

        $requiredRole = ltrim($role, ':');
        $authUser = Auth::user();

        // 前提:在User模型中定义与Role的关联
        // public function role() { return $this->belongsTo(\App\Models\Roles::class); }
        $userRoleName = $authUser->role->name;

        if ($userRoleName === $requiredRole) {
            return $next($request);
        }

        // 权限不匹配时,重定向到不受该中间件限制的页面,比如首页或无权限提示页
        return redirect()->route('home')->with('error', '你没有访问该页面的权限');
    }
}

关键修改点

  • 解决循环重定向:放弃使用redirect()->back(),改为重定向到明确的、不受该中间件保护的路由(比如首页home),或者专门的无权限提示页面。
  • 简化角色查询:通过Eloquent关联$authUser->role->name直接获取角色名,比手动查询Roles模型更简洁高效,需要先在User模型中添加关联:
    // 在App\Models\User中添加
    public function role()
    {
        return $this->belongsTo(\App\Models\Roles::class);
    }
    
  • 传递并展示错误信息:用with('error', 'xxx')将错误信息存入session,前端可以通过Blade模板获取并展示:
    @if(session('error'))
        <div class="alert alert-danger">
            {{ session('error') }}
        </div>
    @endif
    
  • 提前处理未登录场景:在逻辑最开始判断用户是否登录,避免后续无效操作。

内容的提问来源于stack exchange,提问作者Mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:25:29