如果我有嵌套资源,例如
resources :club do
resources :agenda
end
他们的关系如下:
club has_many agendas
agenda belongs_to club
如果我的议程的创建操作接受params[:club_id]
并将其分配给议程的俱乐部参考,是否可以安全地假设用户无法修改该字段(club_id不属于我的params.require.permit
)?
我的意思是,在使用params[:club_id]
创建议程之前,我是否还需要检查club_id是否属于当前用户,还是我相信params[:club_id]
无法被篡改用户。
我担心用户只需修改params的哈希就可以从其他俱乐部创建议程。
fyi,我正在使用的一些相关宝石是设计和cancan。
答案 0 :(得分:0)
首先,你需要阅读authorization(关于它的伟大Railscast)
<强>系统强>
然后您需要确保正确设置系统:
如果users
无法修改特定资源,则需要授权才能编辑/提交这些资源。为此,您可以使用cancan
gem来确定用户是否可以在控制器级别编辑/创建资源:
#app/controllers/agendas_controller.rb
load_and_authorize_resource
这首先确保您能够确定current_user
是否实际上能够将club
更改为
<强> PARAMS 强>
要做的第二件事是确保正确处理params
strong params
基本上允许您将特定的参数发送到您的模型,其中包括club_id
。
您遇到的问题是,在提交表单后,您不希望有人注入不同的参数。为防止这种情况发生,您应仅在控制器中指定club_id
- 这将确保前端无法设置值:
params.require(:adgenda).permit(:your,:params).merge(club_id:params [:club_id])
通过设置控制器中的值,这意味着只有服务器可以访问该值,允许您相应地提交
这与前端授权相结合,应为您的应用提供基本的安全级别