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

Cancancan升级至3.5.0后STI权限逻辑异常问题求助

Cancancan STI权限逻辑异常问题(Rails版本适配后)

环境信息

  • Ruby 2.7.8
  • Rails 6.1.7.7
  • Cancancan 3.5.0

问题现象

升级Cancancan适配Rails版本后,Ability文件里的STI权限逻辑出现异常:
执行以下代码时,Post.accessible_by(self).ids会在SQL查询中自动加入customer和employee类型筛选条件,但Post表不存在type字段,直接触发报错:

can :manage, [User::Base,
        User::Customer,
        User::Employee]
can :read, UserFollowedRecord, post_id: Post.accessible_by(self).ids

调整权限定义顺序后,代码可正常运行:

can :manage, [User::Base]
can :read, UserFollowedRecord, post_id: Post.accessible_by(self).ids
can :manage, [User::Customer,
        User::Employee]

问题根源

这是Cancancan处理STI模型权限的已知问题:当一次性声明多个STI父类与子类的权限后,Cancancan会错误地将STI类型筛选逻辑传递给后续非STI模型的accessible_by查询,导致无关模型被添加不存在的type字段查询条件。

临时修复方案

通过调整权限声明顺序规避:

  1. 先单独声明STI父类的权限
  2. 处理其他非STI模型相关的权限逻辑
  3. 最后添加STI子类的权限声明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:50:59