1

ユーザーがいます

class User < ActiveRecord::Base
  devise :database_authenticatable,
         :recoverable, :rememberable, :trackable, :validatable


  attr_accessible :email, :password, :password_confirmation,
                  :remember_me, :site_id, :role_name

  belongs_to :site

end

サイト

class Site < ActiveRecord::Base
  has_many :users
  has_one :front_page_campaign
end

およびfront_page_campaigns

class FrontPageCampaign < ActiveRecord::Base
  belongs_to :site
end

私はcancanを使用してアクセスを制限しているので、ユーザーは自分のサイトのfront_page_campaignsのみを管理できます。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    case user.role_name

    when "super_admin"
      # can do everything
      can :manage, :all

    when "editor"
      # can edit content for their site
      can [:create, :read, :update], FrontPageCampaign, site_id: user.site_id

    end
  end
end

これは、role_nameを持つユーザー、super_adminおよびでのeditor表示と編集で完全に機能しますfront_page_campaigns。しかしeditor、新しいfront_page_campaignを作成しようとすると、カンカン禁止の通知が表示されます

You are not authorized to access this page.

標準フォームにはすべてのサイトのドロップダウンボックスがあり、これをユーザー自身のサイトだけに制限する必要があると思います。どうすればこれを行うことができますか?

4

1 に答える 1

1

承認の問題は、次を追加することで解決されます。

can :new, FrontPageCampaign

カンカン能力初期化のエディターセクションに。新規および作成オブジェクトにsite_idを設定するには、before_filterを設定できます。

# FrontPageCampaignsController
before_filter :set_site_id, :only => [:new, :create]

protected

def set_site_id
  @resource.site_id = current_user.site_id if current_user && current_user.role_name == 'editor'
end

リソースが作成された後、承認できるようになる前に、これが起動することを確認する必要があります。

フォームで(superadminとeditorに同じものを使用する場合)、サイトのドロップダウン選択を読み取り専用にするか、。の場合は非表示にしますcurrent_user.role_name == 'editor'

誰かがフォームを改ざんし、エイリアンのsite_idをエディターとして送信した場合、それはbeforeフィルターによって修正されることに注意してください。これは良くありません。あなたが外に出て持っている場合:only => :new、彼らはcancanによる認証エラーを受け取ります。あなたがスーパーペダントである場合は、代わりに検証エラーのある有効な応答を取得する必要があります。これは、1)before_filterをnewにのみ適用し、2)sayinabilityinitによって達成できます。

when "editor"
  # can edit content for their site
  can [:read, :update], FrontPageCampaign, site_id: user.site_id
  can [:create, :new], FrontPageCampaign
end

3)モデル検証にサイト所有者チェックを追加します。これは私の好ましい方法であり、既存のリソースへの不正アクセスに対する承認エラーを保持します。

これがあなたの質問に答えることを願っています

于 2012-05-24T10:50:34.080 に答える