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

如何通过Laravel路由中间件向Policy传递多个参数

问题原因

你现有的路由写法返回403是因为can中间件默认会将动作后的第一个参数作为关联策略的模型实例,你写的can:store,group,invitee会尝试查找Group模型对应的Policy下的store方法,而非你需要的GroupInvitationPolicy,所以匹配不到正确的权限校验逻辑。

正确写法

Laravel的can中间件支持显式指定策略关联的模型类,只需要将你控制器中authorize方法的第一个参数(也就是策略绑定的模型类)作为can参数的第二个值,后面按顺序跟上路由参数名即可:

use App\Models\GroupInvitation;

Route::post('/{group}/invite/{invitee}', [GroupInvitationController::class, 'store'])
    ->middleware('can:store,' . GroupInvitation::class . ',group,invitee');

如果你的Laravel版本支持字符串插值,也可以直接写全类名:

->middleware("can:store,\App\Models\GroupInvitation,group,invitee");

必要前提

  1. 确认你已经在app/Providers/AuthServiceProvider.php的$policies数组中注册了策略绑定:
protected $policies = [
    GroupInvitation::class => GroupInvitationPolicy::class,
];
  1. 确认路由参数{group}和{invitee}已经配置了正确的路由模型绑定,能够自动解析为对应的Group和User模型实例,参数顺序和GroupInvitationPolicy的store方法中除首个User参数外的顺序完全对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:03:03