关于简单授权的问题

时间:2011-05-19 06:03:45

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

我正在使用Devise进行身份验证,我只需要一个简单的管理员或使用一些控制器检查。我是rails的新手,所以我试图以正确的方式做到这一点。我基本上已经为用户模型添加了一个布尔管理字段并添加了这个方法

  def is_admin?
    admin == 1
  end

然后我只是将控制器动作修改为

  def new
    if current_user.nil? || !current_user.is_admin?
        flash[:notice] = "You do not have permission to view this page"
        redirect_to "/gyms"
      else
      @gym = Gym.new

      respond_to do |format|
        format.html # new.html.erb
        format.xml  { render :xml => @gym }
      end
    end
  end

所以这个解决方案有效,但我应该以不同的方式做这个吗?

1 个答案:

答案 0 :(得分:2)

这样可行,但除了小规模项目之外,我可能不会推荐这个解决方案。随着时间的推移,如果您在控制器中执行授权检查,您的代码将变得臃肿且难以管理。

相反,我会考虑使用Cancan等授权模块,将授权规则集中在一个地方,从而将应用程序逻辑与授权逻辑分离。最终结果是更清晰,更易于维护的代码。

使用Cancan后,您的代码可能如下所示:

# app/controllers/gyms_controller.rb
class GymsController < ApplicationController
  load_and_autorize_resource

  def new
      respond_to do |format|
        format.html # new.html.erb
        format.xml  { render :xml => @gym }
      end
    end
  end
end

# app/models/Ability.rb
can :create, Gym do |trip|
  user.is_admin?
end