Laravel 8 配置角色中间件后无法实现路由权限控制的问题排查
问题根因定位
问题核心是User模型中hasRole方法的逻辑完全错误,导致角色校验失效:
- 当前
hasRole方法执行的是全局查询所有匹配传入角色的用户集合,而非校验当前登录用户是否持有对应角色 - 集合对象在PHP布尔判断中永远为
true(只要数据库中存在至少1个对应角色的用户),因此!$request->user()->hasRole($role)的判断条件永远不触发,无权限用户也能正常访问路由
修复方案
第一步:修正User模型的hasRole方法
将原有hasRole方法替换为以下代码,直接校验当前用户实例的role字段值:
public function hasRole(string $role): bool { // 直接判断当前登录用户的role属性是否匹配传入的角色 return $this->role === $role; }
第二步(可选优化):补充异常兜底逻辑
如果存在用户role字段为空的场景,可以额外增加非空校验避免逻辑异常:
public function hasRole(string $role): bool { return filled($this->role) && $this->role === $role; }
第三步(可选扩展):支持多角色校验
如果后续需要支持一个路由允许多个角色访问(比如路由中间件配置为role:administrador,medico),可以修改中间件的handle方法适配:
public function handle(Request $request, Closure $next, ...$roles) { foreach ($roles as $role) { if ($request->user()->hasRole($role)) { return $next($request); } } return back(); }
内容的提问来源于stack exchange,提问作者Diego Utreras
相关产品推荐
相关产品推荐

