0

我目前正在尝试将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检查附加到这些抽象的查找器上。

在更新(可能是创建)的情况下,请注意权威的双重检查。

4

1 回答 1

1

我依靠ActiveSupport::Concern简化模块。我将我的关注点存储在一个名为concernsunder的目录中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

于 2013-07-19T09:41:20.053 回答