使用 Pundit Gem 的强大功能在 Ruby on Rails 中简化授权

这是一篇关于在 Ruby on Rails 中使用 Pundit 进行授权的文章,主要内容如下:

  • 背景:作者 Denis 近期在构建一个用于 HR 和财务、网站及团队管理的一站式 CRM 系统,随着系统扩展,高效管理授权成为挑战,Pundit 宝石能解决此问题。
  • 为何选择 Pundit:它是轻量级、基于策略的 Rails 授权库,简单易读维护,具有灵活性、可扩展性和安全性,能进行细粒度的动作特定权限处理,与 CanCanCan 相比,在灵活性、复杂性和性能上各有特点。
  • 开始使用 Pundit

    • 安装宝石:将 Pundit 添加到 Gemfile 并运行 bundle install,然后安装生成 ApplicationPolicy 基类。
    • 定义策略:策略是存储在 app/policies/ 目录下的 Ruby 类,用于定义授权规则,方法名表示动作,返回 true 或 false。
    • 在控制器中使用策略:在控制器中使用 authorize 方法根据动作调用相应的策略方法,确保授权检查。
    • 在视图级别处理授权:使用 policy 助手在视图中检查权限,使用 policy_scope 过滤数据,防止未经授权的访问。
    • 定义自定义查询范围:在 Policy 中定义 Scope 类,用于基于用户角色获取数据,可指定额外参数,还可选择特定的 Scope 方法。
    • 在 Rails 中捕获拒绝的授权:Pundit 抛出 Pundit::NotAuthorizedError 可在 ApplicationController 中捕获并处理,可自定义处理方式。
  • 使用 Pundit 的最佳实践

    • 创建独立模块:使用 load_and_authorize_resource 方法加载和授权资源,减少控制器代码,保持控制器干净可维护。
    • 其他实践:保持策略简洁专注,使用范围进行查询级授权,在控制器中始终调用 authorize,避免在模型中处理授权逻辑。
  • 总结:Pundit 通过策略、范围和控制器授权简化了 Ruby on Rails 中的授权,可创建安全、可维护和可扩展的应用,对于需要基于角色的访问控制的 Rails 应用是强大的工具。
阅读 9
0 条评论