Laravel 10使用laravel/ui auth时Auth::user()读取属性报错
问题原因分析
你把Auth::routes()放到了checkRole中间件组里,而登录、登录处理这类路由是给未登录用户访问的——此时Auth::user()会返回null,直接访问role_id自然触发「Attempt to read property on null」错误。之前用Breeze时路由结构不同,没有把登录路由纳入权限中间件范围,所以没出现这个问题。
解决方案
1. 修正中间件逻辑,先校验登录状态
修改checkRole中间件,先确认用户已登录,再判断角色权限:
public function handle(Request $request, Closure $next): Response { // 未登录用户直接跳转到登录页 if (!Auth::check()) { return redirect()->route('login'); } // 已登录用户再校验角色 if (Auth::user()->role_id != 1) { return redirect()->route("welcomepage"); } return $next($request); }
2. 调整路由配置,拆分Auth路由与仪表盘路由
把Auth::routes()移出checkRole中间件组,仅给仪表盘路由同时添加auth和checkRole中间件:
// 单独配置Auth路由,不需要权限校验 Auth::routes(["register" => false, "reset" => false]); // 仪表盘专属路由,需同时满足登录+角色权限 Route::middleware(["auth", "checkRole"])->group(function() { // 示例仪表盘路由,替换为你的实际路由 Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); });
关键说明
auth中间件会确保只有已登录用户能进入该路由组,避免未登录用户触发Auth::user()为null的情况;同时要保证checkRole在auth之后执行,这样Auth::user()一定是有效的用户实例。
内容的提问来源于stack exchange,提问作者Raitiko
相关产品推荐
相关产品推荐

