我有一个模型UserResource
的RESTful控制器。我添加了一个名为remote_update
的自定义操作,我希望仅在用户的ID匹配时限制该操作:
if user.has_role? :admin
can :manage, :all
elsif user.has_role? :regular
can [:remote_update], UserResource, :user_id => user.id
end
我在控制器中使用load_and_authorize_resource
。
问题是即使用户ID不匹配,用户仍然可以使用该操作。 (为了测试,我正在使用Firebug并更改id的隐藏值。)
我的路线如下:
resources :user_resources do
collection do
post 'remote_update'
end
端
根据https://github.com/ryanb/cancan/wiki/Authorizing-controller-actions,当我们有自定义操作时,Cancan会尝试使用ID从链接加载资源:
def discontinue
# Automatically does the following:
# @product = Product.find(params[:id])
# authorize! :discontinue, @product
end
我没有定义id,因为它是POST,而不是GET或PUT。 关于如何构建能力的问题?谢谢。
答案 0 :(得分:1)
看起来您正在尝试使用POST进行更新('remote_update')。应该创建一个POST,因此通常不应该有一个填充的id。因此我不希望CanCan为你做那个查找。
我建议您:
手动查找产品并在您的停止方法中对其进行授权,
或
使用PUT
顺便说一句,这种能力对我来说是正确的。