Laravel配置Policy禁止查看他人资料却无法访问自身页面怎么解决
问题原因及修复方案
核心错误点
- 权限判断逻辑错误:你在Policy中直接将
User模型实例和整数类型的用户ID做===恒等比较,两种不同类型的变量恒等判断永远返回false,这是用户无法访问自己个人资料的核心原因。 - 路由参数与权限中间件参数不匹配:你当前路由定义的参数是
{id},但can中间件中指定的参数是user,Laravel无法自动匹配到对应的用户模型实例传入Policy,会导致Policy接收的参数不符合预期。
修复步骤
- 修改Policy的判断逻辑,补充参数类型约束,改为比较两个用户的ID值:
public function show(User $authenticatedUser, User $user_model) { return $authenticatedUser->id === $user_model->id ? Response::allow() : Response::deny(); }
- 修改路由参数名,和can中间件参数对齐,开启Laravel隐式模型绑定:
Route::get('companyuser/{user}', [CompanyUserController::class, 'show']) ->middleware(['role:companyuser', 'can:show,user']);
- 同步修改Controller中show方法的参数,匹配路由参数名:
// CompanyUserController.php public function show(User $user) { // 此处的$user已经是Laravel自动根据路由参数查询到的用户实例 }
可选操作
如果修改后仍不生效,可执行以下命令清空缓存:
php artisan route:clear php artisan config:clear
内容的提问来源于stack exchange,提问作者user3353167
相关产品推荐
相关产品推荐

