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

Ruby on rails 在控制器中执行权限检查的最佳方法。,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我正在尝试在我的web应用程序中实现一个基本的权限系统,我想知道你们认为检查控制器中权限的最佳方法是什么。当我开始编写应用程序时,我最初认为使用before_过滤器是个好主意,我的代码最终看起来像这样: before_filter :authenticate, :only => [:new, :create, :show, :edit, :update, :destroy, :delete] before_filter :check_league_existence before_filt

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

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
我的过滤器看起来像这样:

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工具箱:

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

我已经成功地使用了声明性授权,但是cancan似乎是一个非常好的解决方案

以下是两种框架的优秀屏幕广播:


附言:你可能也会感兴趣

太棒了,谢谢!这肯定是一个进步。希望它能解决所有的测试问题。