仅允许某些用户使用的强参数和变量背后的理由



我很难理解强参数。我知道它可以防止大量分配你不允许的变量。但在Hartl的教程中,我也读到,如果没有强参数,某人可以通过补丁请求更改任何用户的管理状态(我想这不是大规模分配,因为这只是你会更改的一个值)。但是,如何为以下变量实现强参数:

  • 应该只允许设置一次(创建新用户时)
  • 一些用户应该可以更改,但其他用户则不能

例如,我有:

private
def user_params
params.require(:user).permit(:email,
:username,
#:verified,
#:admin,
#:moderator,
#:activated, 
#:activated_at, 
:password, 
:password_confirmation)
end

现在,我理解的带有破折号的应该是不允许的。否则,用户可以通过批量分配(或其他方式)更改其值。

但是:

  • 管理员用户(来自同一表/控制器的特定用户)应该能够为所有用户更改这些变量
  • 就我的应用程序而言,组织(另一个表)应该能够授予用户主持人权限,从而为用户更改这些值
  • 只有在创建新用户时才应设置用户名,之后再也不允许更改用户名。现在,允许strong_params中的用户名不意味着它很容易通过大规模分配进行更改吗

强参数与这些问题有何关系?

虽然最简单的情况是user_params总是做同样的事情,并被所有对update_attributes的调用使用,但这只是最简单的例子。

基于当前用户的权限进行许可或为不同的操作设置不同的许可列表是非常明智的(因此可能只有创建操作中使用的许可列表才允许:username)。

您可以考虑的另一种模式是为那些具有管理访问权限的用户提供Admin命名空间:Admin::UsersController将允许更多字段发生突变,并可能暴露出更多普通用户不应该访问的功能或数据。

我不是专家,但据我所知:当你设置强参数时,你通常会控制传递到update_attributes/create方法中的内容。因此,您正在定义中存在的内容

params[:user][ ... ]

admin更新user的情况下,您不需要POST整个用户对象,只需调用一个特定的函数,该函数将更改您想要更改的user属性。换句话说:

$.ajax(
{ "method": "PUT", "url": "/users/" + uid },
{ "task": "make_admin" }
);

在你的控制器中:

def update
if params[:task] == "make_admin" && user_is_authorized
User.find(params[:id]).admin = true
end
end

最新更新