我目前正在尝试将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
检查添加到这些抽象的查找器上会很好。
注意权限在更新的情况下的双重检查(并且可能是创建)。
答案 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