3

継承されたリソースと組み合わせた CanCan でのモデルの 3 レベルのネストに問題があります。すべてを 2 レベルまでネストする必要があると読みましたが、すべてをaccountモデルの下に配置する必要があったため、CanCan でこれを実行してみました。

load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project

それを上書きしているように、@project の値を持つ @account 変数が得られます。@project は本来あるべきものであり、@model もそうです。それは私のせいですか、CanCan's、継承されたリソースですか、それとも CanCan が 3 レベルのネストをサポートしていないだけですか? また、ModelsController の IR でこれを行います。

belongs_to :account, :finder => :find_by_name! do
  belongs_to :project, :finder => :find_by_name!
end

load_and_別の奇妙なことは、CanCan の定義からその部分を削除したときです。その場合は機能しますが、その部分を使用しないと危険になる可能性があることを読みましたload.

のみを使用できますか、authorize_resourceまたは CanCan で何かを行う必要がありますか?

4

1 に答える 1

2

私が言える限り、あなたの権限は正しいものです。

CanCan gem ryan の開発者は、これがどのように動作するかを投稿しました: https://github.com/ryanb/cancan/issues/127#issuecomment-364475

つまり、あなたの

load_and_authorize_resource :account
load_and_authorize_resource :project, :through => :account
load_and_authorize_resource :model, :through => :project

次のようなブロックになります (ここではアクションを作成します。他のアクションでは、最後の承認が必要です! と @model が変更されます):

@account = Account.find(params[:account_id])
authorize! :read, @account
@project = @account.projects.find(params[:project_id])
authorize! :read, @project
@model = @project.models.build
authorize! :new, @model

この回答が、ネストされた cancan 承認を探している開発者に役立つことを願っています :-) 。

ソース: https://github.com/ryanb/cancan/issues/127#issuecomment-364475


ps: /accounts/1/projects/2/models/new の間違った動作:

load_and_authorize_resource :project
load_and_authorize_resource :model, :through => :project

これは一種のセキュリティ上の問題です。

@project = Project.find(params[:project_id]) [...]

、現在のアカウントがリンクされたアカウント '1' の読み取りを許可されているかどうかを確認しません。また、プロジェクト '2' が本当にアカウント '1' のプロジェクトであるかどうかはチェックしません。

于 2013-06-18T14:05:13.770 に答える