ruby-on-rails - 在 Controller 中进行权限检查的最佳方法。

标签 ruby-on-rails ruby-on-rails-3

我正在尝试在我的 Web 应用程序中实现一个原始权限系统,我想知道你们都认为在我的 Controller 中检查权限的最佳方法是什么。当我开始编写应用程序时,我最初认为使用 before_filter 是个好主意,我的代码最终看起来像这样:

before_filter :authenticate, :only => [:new, :create, :show, :edit, :update, :destroy, :delete]
before_filter :check_league_existence
before_filter :check_league_relation_existence, :except => [:new, :create, :index]
before_filter :check_ownership, :only => [:delete, :destroy]
before_filter :check_user_joinability, :only => [:new, :create]
before_filter :require_moderator, :only => [:edit, :update]

我的过滤器看起来像这样:
def check_league_relation_existence
  raise ActiveRecord::RecordNotFound.new('Not Found') unless current_league_relation && current_league.league_relations.include?(current_league_relation)
end

def check_ownership
  raise ActionController::RoutingError.new('You do not own this league relation. Permission Denied.') unless current_league_relation.user == current_user || current_user_league_relation.moderator?
end

现在这个系统在某种程度上确实有效,但它有很多问题。其中最大的两个是:1)很难理解发生了什么,因为有这么多过滤器,2)我不知道如何为此编写功能测试,因为在未经授权的测试时总是会发现错误使用权。有没有人对检查权限的更好方法有任何建议?

最佳答案

我个人认为最好的方法是使用现有的授权框架之一。它会为您节省很多时间和麻烦。看看 Ruby 工具箱:

Rails Authorization

正如你所说,否则你的代码真的会变得一团糟。此外,以后很难添加具有额外权限的额外角色。例如,如果您添加管理员角色,该角色会覆盖某些检查。

我在 上取得了成功declarative_authorization ,还有康康 似乎是一个很好的解决方案。

以下是两个框架的优秀截屏视频:

  • Declarative Authorization
  • Authorization with CanCan

  • PS:authentication frameworks你也可能感兴趣。

    关于ruby-on-rails - 在 Controller 中进行权限检查的最佳方法。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088486/

    相关文章:

    ruby-on-rails - Ruby on Rails 中的电子邮件模板

    ruby-on-rails - Rails应用程序流程图生成?

    ruby-on-rails - Ruby on Rails 3 简单的分组和计数

    ruby-on-rails - 更新多个记录上的单个属性的最佳实践

    ruby-on-rails - 批量插入 rails 3

    ruby-on-rails - 'attr_accessible' 效果

    javascript - 在不加载所有 id 记录的情况下搜索 Ember 数据异步 hasMany ids

    ruby-on-rails - Rails 4 + Devise - 更新用户帐户时不允许的参数

    ruby-on-rails - 更新操作中的 Rails HABTM ActiveRecord::RecordNotFound

    ruby-on-rails - 使用 aws-sdk for ruby​​ in rails 下载 S3 文件(对象)