在控制器中执行权限检查的最佳方法。

时间:2011-08-17 05:54:12

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

我正在尝试在我的网络应用中实现一个原始权限系统,我想知道你们都认为检查控制器权限的最佳方法。当我开始编写应用程序时,我原本以为使用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)我不知道如何为此编写功能测试,因为在测试未授权时总是会收到错误访问。有没有人对更好的方法检查权限有任何建议?

1 个答案:

答案 0 :(得分:7)

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

Rails Authorization

正如你所说,否则你的代码真的会变得混乱。此外,以后添加具有其他权限的其他角色非常困难。例如,如果添加管理员角色,则会覆盖某些检查。

我在 declarative_authorization 方面取得了成功,但 cancan 似乎是一个非常好的解决方案。

以下是两个框架的良好截屏视频:

PS:authentication frameworks也可能会让您感兴趣。