集成inherited_resources和权限

时间:2013-05-03 03:03:31

标签: ruby-on-rails-3.2 inherited-resources authority-gem

我目前正在尝试将inherited_resources和权限集成到我的Rails应用程序中。

对于检查基于资源执行控制器操作的能力的最佳位置,我有点困惑。此代码作为权限中的示例提供:

  def edit
    @llama = Llama.find(params[:id])
    authorize_action_for(@llama)        # Check to see if you're allowed to edit this llama. failure == SecurityViolation
  end

  def update
    @llama = Llama.find(params[:id])
    authorize_action_for(@llama)        # Check to see if you're allowed to edit this llama.
    @llama.attributes = params[:llama]  # Don't save the attributes before authorizing
    authorize_action_for(@llama)        # Check again, to see if the changes are allowed.
    if @llama.save?
    # etc
  end

因为在inherited_resources中,查找器被抽象掉了,我认为将authorise_action_for检查添加到这些抽象的查找器上会很好。

注意权限在更新的情况下的双重检查(并且可能是创建)。

1 个答案:

答案 0 :(得分:1)

我依靠ActiveSupport::Concern来简化模块。我将我的问题存储在concerns下的app目录中。我将此称为inherited_resources_with_authority.rb,您可能需要修改autoload_paths中的application.rb以从此文件夹中加载文件。

module InheritedResourcesWithAuthority

    extend ActiveSupport::Concern

    included do
        inherit_resources
        authorize_actions_for :resource_class

        alias_method_chain :resource, :authority
        alias_method_chain :build_resource, :authority
        alias_method_chain :update_resource, :authority
    end

    protected

    def resource_with_authority
        resource_without_authority
        authorize_action_for(get_resource_ivar)
    end

    def build_resource_with_authority
        build_resource_without_authority
        authorize_action_for(get_resource_ivar)
    end

    def update_resource_with_authority(object, attributes)
        object.assign_attributes(*attributes)
        authorize_action_for(object)
        object.save
    end

end

我们基本上链接了重要的inherited_resources'抽象方法,并在必要时插入我们的授权代码。最后一个是最棘手的,因为我们无法调用我们正在链接的原始方法,所以我们必须在这里复制一些inherited_resources'代码。

要使用此问题,只需从控制器中调用include InheritedResourcesWithAuthority即可。

注意您不能在控制器上使用激活inherited_resources的类继承方法,因为我们已经在使用此问题中的其他方法。

此处完整撰写:https://coderwall.com/p/tp5sig

建议绝对值得欢迎:D