0

使用 Rails 3.2。我正在尝试通过检查用户对所有 crud 操作的权限来保护我的应用程序。以下是其中一个示例:

class StatesController < ApplicationController  
  def create
    @country = Country.find(params[:country_id])
    if can_edit(@country)
      @state.save
    else
      redirect_to country_path
    end
  end

  def destroy
    @country = Country.find(params[:country_id])
    if can_edit(@country)
      @state = State.find(params[:id])
      @state.destroy
    else
      redirect_to country_path
    end
  end
end

class ApplicationController < ActionController::Base
  def is_owner?(object)
    current_user == object.user
  end

  def can_edit?(object)
    if logged_in?
      is_owner?(object) || current_user.admin?
    end
  end
end

我注意到我一直在包装can_edit?许多控制器。有没有 DRYer 方法可以做到这一点?

注意:所有必须包含一个对象来检查登录用户是否是所有者。

4

1 回答 1

0

您正在寻找授权库。您应该查看CanCan,它允许您设置特定用户或用户组可以访问哪些对象的某些规则。

它有一个方法,load_and_authorize_resource你可以在给定的控制器中调用它。所以你的雕像控​​制器看起来像:

class StatesController < ApplicationController
  load_and_authorize_resource :country

  def create
    @state.save
  end

  def destroy
    @state = State.find(params[:id])
    @state.destroy
  end
end

CanCan会先加载国家,判断用户是否有权限查看该资源。如果没有,它将引发错误(您可以在该控制器或 ApplicationController 中拯救它以返回适当的响应”。)然后您可以@country在知道用户有权这样做的情况下访问任何控制器操作。

于 2013-05-12T05:27:09.923 回答