我有用户、帐户和角色模型。Role存储Account和User之间的关系类型。
我留空attr_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、Moderatorship、Subscribership 等......,并让它们从 Role 继承。如果我想坚持单一的角色模型,我怎样才能拥有动态角色而不让自己暴露于批量分配漏洞?
额外的问题:我应该使用用户 has_many 角色(用户可以为每种角色类型拥有一条记录)还是 has_one 角色(用户只能拥有一个角色记录,如果他们的角色发生变化必须切换)模式?
class User < ActiveRecord::Base
attr_accessible :name, :email
has_many :accounts, through: roles
end
class Account < ActiveRecord::Base
attr_accessible :title
has_many :users, through: roles
end
class Role < ActiveRecord::Base
attr_accessible
belongs_to: :user
belongs_to: :account
end