2012-02-02 1 views
1

これは私ability.rbクラスの要部である:アクションがインデックスであっても、ブロックでcancanを有効にするのはなぜですか?

def initialize(user) 
    can :manage, User do |u|· 
    user == u· 
    end 
end 

cancan documentationによれば:

実際のインスタンスオブジェクトが存在する場合、ブロックのみが評価されます。 クラスのアクセス許可をチェックするときに評価されません( インデックスアクションなど)。

ブロックが実行されない場合でもしかし、UsersControllerindexアクションのために、それはまだ、ユーザーをリスト、:manage権限を付与します。

私は上記のコードをコメントアウトすることでこれを確認した後、ユーザーは承認されていません。

cancanを理解する限り、ブロックは実行されるはずです(実際には実行されません)。ブロックが実行されない場合、ブロックはfalseを返したと見なされ、許可を与えません。 。

これは間違っているのですか、これはバグですか?

私はcancanバージョン1.67を使用しています。

答えて

2

私はあなたがここにドキュメントを読み違えていると思う:インスタンスが評価されていない場合

をではなく、実行されるべき一切のインスタンスチェックがないように、クラスカンカンはブロックを実行しません。 これにより、ブロックを弾力なくするという面倒を省くことができます。 ブロックは決して実行されないので、返されるものは仮定されておらず、cancanはクラスルールだけを見ます。それはあなたが(もう少し複雑なモデルでは)これを考慮する必要があると思いブロックを呼び出したい場合

can :manage, Post do |p| 
    p.category.owner == user #this will blow up because of nil 
end 

を私はデフォルトはhereに埋設されていると思いますが、これは賢明なデフォルトのように思えます。 ユーザが自分の投稿を管理できるようにする場合は、とにかくインデックスに他の投稿が表示されないようにする必要があります。したがって、唯一の脅威は、彼が明示的にアクセスできないリソースにアクセスしていることです。 (Cancanは通常のActiveRecordクエリでは決して接続されず、能力によってフィルタリングされないので、User.allは常に能力に関係なくすべてのユーザを返す)

ただし、プロファイルのようなものを実装しようとすると、あなたのUsersControllerロジックをちょっと変更して、単にそのプロファイルを単なるリソースにすることをお勧めします。Rails Guides

+1

ブロックが実行されていないのは大丈夫です。しかし、ブロックが実行されていなくても、デフォルトで許可を与えているのは驚きです。 – Ovesh

関連する問題