0

ユーザー、アカウント、およびロール モデルがあります。役割は、アカウントとユーザーの間の関係タイプを保存します。

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
4

2 に答える 2

2

attr_accessibleで「as」を使用して、さまざまな割り当て機能を使用できます。例えば、

attr_accessible :type, as: :admin

次に、一括割り当てを行うと、次のようなことができます。

@role.update_attributes {type: :moderator}, as: :admin # Will update type
@role.update_attributes {type: :moderator} # Will not update type
于 2012-04-29T21:05:29.830 に答える
1

最も柔軟なアプローチはmass_assignment_authorizer、モデル クラスのメソッドをオーバーライドして、アクセス可能な属性を動的に変更することです。

例えば:

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

  private
  def mass_assignment_authorizer
    super + (accessible || [])
  end
end

これで、次のように使用できます。

@article.accessible = [:important] if admin?

この例はRailsCast #237からのもので、このアプローチの詳細を学ぶことができます。


また、役割やアビリティの扱いに役立つCanCan gemもおすすめです。

于 2012-04-29T21:21:23.593 に答える