ユーザー、アカウント、およびロール モデルがあります。役割は、アカウントとユーザーの間の関係タイプを保存します。
attr_accessible
一括割り当ての脆弱性を防ぐために空白のままRole
にしました (そうしないと、攻撃者がロール タイプ (所有者、管理者など)、アカウントまたはユーザー ID を変更する可能性があります)。
しかし、管理者がサブスクライバーをモデレーターに変更したい場合はどうすればよいでしょうか? これにより、一括割り当てセキュリティ例外が発生します。
user = User.find(params[:id])
role = user.roles.find_by_account_id(params[:account_id])
role.type = "admin"
これを解決するにはどうすればよいですか?1 つの方法は、各役割 (所有者、管理者、モデレーター、サブスクライバー) を表す個別のモデルを作成し、STI タイプのパターンを使用することです。これにより、次のことができます。
user = User.find(params[:id])
user.moderatorship.build(account_id: params([:account_id])
面倒!Onwership、Moderatorship、Subscribership などを作成し、Role から継承させる必要があります。単一の役割モデルに固執したい場合、一括割り当ての脆弱性にさらされることなく動的な役割を持つにはどうすればよいですか?
おまけの質問: User has_many roles (ユーザーはロール タイプごとに 1 つのレコードを持つことができます) または has_one role (ユーザーはロール レコードを 1 つしか持つことができず、ロールが変更された場合に切り替える必要があります) パターンを使用する必要がありますか?
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