Ruby on rails 如何使用动态角色避免批量分配漏洞?

Ruby on rails 如何使用动态角色避免批量分配漏洞?,ruby-on-rails,ruby,authorization,roles,mass-assignment,Ruby On Rails,Ruby,Authorization,Roles,Mass Assignment,我有用户、帐户和角色模型。角色存储帐户和用户之间的关系类型 我将attr\u accessible中的Role留空,以防止出现大规模分配漏洞(否则攻击者可能会更改角色类型--所有者、管理员等…--帐户或用户ID) 但是,如果管理员想将订阅者更改为版主,该怎么办?这将引发批量分配安全异常: user = User.find(params[:id]) role = user.roles.find_by_account_id(params[:account_id]) role.type = "admi

我有用户、帐户和角色模型。角色存储帐户和用户之间的关系类型

我将
attr\u accessible
中的
Role
留空,以防止出现大规模分配漏洞(否则攻击者可能会更改角色类型--所有者、管理员等…--帐户或用户ID)

但是,如果管理员想将订阅者更改为版主,该怎么办?这将引发批量分配安全异常:

user = User.find(params[:id])
role = user.roles.find_by_account_id(params[:account_id])
role.type = "admin"
我如何解决这个问题?一种方法是创建一个单独的模型来表示每个角色(所有者、管理员、主持人、订阅者),并使用STI类型的模式。这让我可以做到:

user = User.find(params[:id])
user.moderatorship.build(account_id: params([:account_id])
单调乏味!我必须创建Onwership、版主、订阅等,并让它们从角色继承。如果我想坚持单一角色模型,我如何能够拥有动态角色而不暴露于大规模分配漏洞

附加问题:我应该使用一个用户有多个角色(每个角色类型可以有一个记录)还是只有一个角色(用户只能有一个角色记录,如果角色更改,必须切换)模式

class用户
您可以将“as”与attr\u一起使用,以获得不同的分配能力。比如说,

attr_accessible :type, as: :admin
然后,当你做集体作业时,你可以做如下的事情

@role.update_attributes {type: :moderator}, as: :admin # Will update type
@role.update_attributes {type: :moderator} # Will not update type
您可以将“as”与attr_accessible一起使用,以获得不同的分配能力。比如说,

attr_accessible :type, as: :admin
然后,当你做集体作业时,你可以做如下的事情

@role.update_attributes {type: :moderator}, as: :admin # Will update type
@role.update_attributes {type: :moderator} # Will not update type

最灵活的方法是重写模型类中的
mass\u assignment\u authorizer
方法,以动态更改可访问属性

例如:

class Article < ActiveRecord::Base
  attr_accessible :name, :content
  attr_accessor :accessible

  private
  def mass_assignment_authorizer
    super + (accessible || [])
  end
end
此示例来自,您可以从中了解有关此方法的更多信息



此外,我想向您推荐gem,它可以帮助您处理角色和能力。

最灵活的方法是重写model类中的
mass\u assignment\u authorizer
方法来动态更改可访问的属性

例如:

class Article < ActiveRecord::Base
  attr_accessible :name, :content
  attr_accessor :accessible

  private
  def mass_assignment_authorizer
    super + (accessible || [])
  end
end
此示例来自,您可以从中了解有关此方法的更多信息



此外,我想向您推荐gem,它可以帮助您处理角色和能力。

谢谢。您是否建议使用
as::admi
?另外,我应该单独问这个问题,但是每个用户是否有多个或单个角色记录?(奖金问题)正如我所说,此解决方案更加灵活,使您能够将批量分配保护与任何授权系统集成。通常,我在用户模型中只使用一个字段来表示他的角色和每个角色的“列表”。最后,我更喜欢cancan gem,它非常容易使用。是的,我需要角色表。我有许多帐户,可以订阅和主持许多用户。因此,单个字段不是一个选项。我只是不确定是坚持每个角色类型、每个用户、每个帐户一行还是多行。在我接受答案之前,我会让这件事再拖延一段时间。干杯谢谢您是否建议使用
as::admi
?另外,我应该单独问这个问题,但是每个用户是否有多个或单个角色记录?(奖金问题)正如我所说,此解决方案更加灵活,使您能够将批量分配保护与任何授权系统集成。通常,我在用户模型中只使用一个字段来表示他的角色和每个角色的“列表”。最后,我更喜欢cancan gem,它非常容易使用。是的,我需要角色表。我有许多帐户,可以订阅和主持许多用户。因此,单个字段不是一个选项。我只是不确定是坚持每个角色类型、每个用户、每个帐户一行还是多行。在我接受答案之前,我会让这件事再拖延一段时间。干杯请您告诉我您的方法和Flexoid方法之间的区别(见其他答案)我真的看不出有什么区别。看起来Flexoid的解决方案将逻辑从模型移动到控制器,我不推荐这样做。(记住,Rails提倡胖模特,瘦控制器。)我认为这里确实有两件事。一个是属性授权(角色类型),另一个是模型授权(角色类型)。我在这里写了一篇关于CanCan和你可以用它做的事情的相当详细的帖子:另外,你可以做一些事情,例如,给定一个你想要修改的用户u1,你可以检查登录的用户是否是u1所属组的管理员等。我肯定认为CanCan是实现这一点的方法。我尝试过其他定制的解决方案两次,两次都回到了坎坎。我至少建议你读一下维基。谢谢,我想我会采用这种方法。最后一件事:我只是不确定是坚持每个角色类型、每个用户、每个帐户一行还是多行。因此,如果User1在角色中有3行(mod、admin等),或者只有一行被切换/更改!另外,我假设您忽略了编写助手方法以获得curret_用户角色的必要性。请您告诉我您的方法与Flexoid方法之间的差异(请参见其他答案)。我没有看到任何差异。看起来Flexoid的解决方案将逻辑从模型移动到控制器,我不推荐这样做。(记住,Rails提倡胖模特,瘦控制器。)我认为这里确实有两件事。一个是属性授权(角色类型),另一个是模型授权(角色类型)。我在这里写了一篇关于坎坎和你可以用它做的事情的相当详细的文章:而且,你可以