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字段查询条件。
临时修复方案
通过调整权限声明顺序规避:
- 先单独声明STI父类的权限
- 处理其他非STI模型相关的权限逻辑
- 最后添加STI子类的权限声明
内容的提问来源于stack exchange,提问作者Kiran Kumawat
相关产品推荐
相关产品推荐

