轨道上的红宝石 - 关于简单授权的问题



我正在使用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

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

这将起作用,但我可能不会推荐此解决方案用于小型项目以外的任何其他项目。随着时间的推移,如果您在控制器中执行授权检查,您的代码将变得臃肿且难以管理。

相反,我会考虑使用像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

最新更新