mcpField
I
implement-authorization

implement-authorization

github.com/igmarin安全2839 次安装4 周前更新
代码仓库

关于 implement-authorization

implement-authorization 是面向 Rails 开发者的授权实现与审查技能,涵盖 Pundit 和 CanCanCan。它强调复用现有框架、使用策略对象、限定查询范围,并验证不同角色的权限。

主要功能

  1. 01识别并沿用现有授权框架
  2. 02使用 Pundit 策略或 CanCanCan Ability
  3. 03在控制器动作中执行授权
  4. 04为索引查询添加权限范围
  5. 05覆盖角色的策略与请求测试
  6. 06输出拒绝访问的验证记录

适用场景

  1. 01为 Rails 资源实现按角色授权
  2. 02审查控制器是否遗漏授权调用
  3. 03限制索引页仅显示可访问记录
  4. 04验证未授权请求及其 HTTP 响应

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/igmarin/rails-agent-skills --skill implement-authorization

安装后在 Claude Code 中输入/implement-authorization确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

EXAMPLES.md
references/
output-style.md
workflow.md

详细介绍

实现授权

快速参考

Gem模式适用场景
Pundit显式策略类复杂的资源级规则
CanCanCan集中式 Ability 类简单的基于角色的权限

核心流程

实施工作流
  1. 检查现有授权机制 — 复用已安装的策略框架;仅当任务需要新框架且项目惯例允许时,才添加 pundit 或 cancancan
  2. 仅在需要时生成基础文件 — 只有在不存在受支持的框架且项目允许使用生成器时,才运行 Gem 的安装程序(rails g pundit:install 或 rails g cancan:ability);否则,使用检测到的框架继续操作,不调用生成器
  3. 定义策略/能力 — 创建策略类(Pundit)或填充 Ability 类(CanCanCan);始终使用策略对象,切勿在控制器中内联授权逻辑
  4. 在控制器中授权 — 在每个操作中调用 authorize @record(Pundit)或 authorize! :action, @record(CanCanCan)
  5. 验证授权 — 在浏览器或控制台中尝试未授权操作,并确认它按预期引发 Pundit::NotAuthorizedError 或 CanCan::AccessDenied;使用已持久化的记录(例如 User.create!),而非尚未保存的记录
  6. 限定查询范围 — 在 index 操作中使用 policy_scope(Model) 或 accessible_by(current_ability)
  7. 测试所有角色 — 编写策略规格和请求规格,覆盖管理员、所有者和访客;检查具体权限,绝不能只检查是否存在
模式
Pundit
class PostPolicy < ApplicationPolicy
  def update?
    user.admin? || record.user_id == user.id
  end
end
CanCanCan
class Ability
  include CanCan::Ability

  def initialize(user)
    can :update, Post, user_id: user.id
    can :manage, :all if user.admin?
  end
end
故障排查
错误可能原因修复方法
Pundit::NotDefinedError未找到该记录对应的策略类创建继承自 ApplicationPolicy 的 app/policies/model_policy.rb
Pundit::AuthorizationNotPerformedError控制器操作中未调用 authorize在操作中添加 authorize @record,或添加 after_action :verify_authorized 以捕获遗漏
意外引发 CanCan::AccessDenied能力规则与当前用户/角色不匹配在控制台中检查 current_ability.can?(:action, @record),以调试规则评估
测试

在策略规格和请求规格中覆盖所有角色(管理员、所有者、访客)。

最简 Pundit 策略规格
RSpec.describe PostPolicy do
  subject { described_class.new(user, post) }

  let(:post) { create(:post, user: owner) }
  let(:owner) { create(:user) }

  context 'as admin' do
    let(:user) { create(:user, :admin) }
    it { is_expected.to permit_action(:update) }
  end

  context 'as owner' do
    let(:user) { owner }
    it { is_expected.to permit_action(:update) }
  end

  context 'as guest' do
    let(:user) { create(:user) }
    it { is_expected.not_to permit_action(:update) }
  end
end

输出样式

实现或审查授权时,输出文件 answer.md 必须包含:

  1. 手动验证拒绝的操作 — 设置专门的章节,提供实际的 Rails 控制台输出;或者明确标示未运行,并说明尝试未授权操作时引发的授权异常。始终使用已持久化的记录(User.create!、Post.create!),绝不使用尚未保存的记录。
  2. HTTP 和策略验证 — 提供具体的 curl 请求或控制器测试命令,并注明拒绝访问时预期的 HTTP 响应代码(例如 403 Forbidden 或 302 Found)。
  3. 语言 — 除非明确要求使用其他语言,否则使用英语。

完整格式示例(包括 Pundit 和 CanCanCan 控制台输出模板)请参阅 references/output-style.md。

集成

技能何时串联
write-tests实现授权测试时。

扩展资源(渐进式披露)

仅在需要相关内容时加载以下文件:

评论

支持 Markdown