如何通过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");
必要前提
- 确认你已经在
app/Providers/AuthServiceProvider.php的$policies数组中注册了策略绑定:
protected $policies = [ GroupInvitation::class => GroupInvitationPolicy::class, ];
- 确认路由参数
{group}和{invitee}已经配置了正确的路由模型绑定,能够自动解析为对应的Group和User模型实例,参数顺序和GroupInvitationPolicy的store方法中除首个User参数外的顺序完全对应。
内容的提问来源于stack exchange,提问作者Jop
相关产品推荐
相关产品推荐

