某些用户只允许强大的参数和变量背后的基本原理

时间:2015-04-13 18:58:09

标签: ruby-on-rails ruby-on-rails-4 strong-parameters

我很难理解强大的障碍。据我所知,它可以防止大量分配您不允许的变量。但是在Hartl的tutorial中我还读到,如果没有强大的障碍,有人可以通过补丁请求改变任何用户的管理员状态(我认为不是大规模分配,因为那个& #39;只需要改变一个值)。但是,你如何为变量实现强对数:

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

例如,我有:

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

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

然而:

  • 管理员用户(来自同一表/控制器的特定用户)应该能够为所有用户更改这些变量。
  • 对于我的应用,组织(不同的表)应该能够授予用户版主权限,从而为用户更改这些值。
  • 只应在创建新用户时设置用户名,之后永远不允许更改用户名。现在,通过在strong_params中允许用户名并不意味着它很容易通过批量分配进行更改?

强对策如何与这些问题相关?

2 个答案:

答案 0 :(得分:0)

我不是专家,但据我所知:当您设置强参数时,通常会控制传递给update_attributes / create方法的内容。所以你要定义内在的东西:

params[:user][ ... ]

如果admin更新user,您不需要POST整个用户对象,您只需调用一个特定的函数即可更改{您想要更改的{1}}属性。换句话说:

user

在你的控制器中:

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

答案 1 :(得分:0)

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

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

您可以考虑的另一种模式是具有管理访问权限的管理员命名空间:Admin::UsersController将允许更多字段发生变异,并且可能会暴露更多普通用户无法访问的功能或数据。