3

認証に Cancan を使用する Rails 3 アプリケーションがあります。私のアプリケーションには次のロジックがあります。管理者は、他のすべてのユーザーを管理するためのアクセス権を持ちcan :manage, User、能力ファイルに設定されています。会社の所有者は、会社の下にあるすべてのユーザーを管理するためのアクセス権を持ちcan :manage, User, company_id: user.company_id、アビリティ ファイルに設定されています。

私のUserController#indexでは、ユーザーが他のすべてのユーザーを管理するアクセス権を持っている場合は 1 つのメソッドを呼び出す必要があり、ユーザーが自分の会社のユーザーにしかアクセスできない場合は別のメソッドを呼び出す必要があります。CanCanでこれを行う方法はありますか?

4

4 に答える 4

3

質問のコメントで説明されているように、これは役割能力のケースのように聞こえます。

役割システムが既に存在し、メソッドを選択するためのロジックがこれらの役割に直接マップされている場合、CanCan 機能を使用することは不必要に複雑になります。CanCan は、特定のモデル オブジェクト、クラス、およびコレクションの能力をチェックすることは得意ですが、そもそもそれらの能力が付与された理由の背後にある元のロジックに戻ることは得意ではありません。

この特定のケースでは、ケースを参照する方法が必要になります"can manage all Users in Company X but NOT all Users"いくつかの if-else 構造で達成できるかもしれませんが、それはあなたが実際に望んでいるものではないと思います。特に、アビリティ ロジックが時間の経過とともに変化する場合は、もはや意味をなさない可能性があります。1 つの例は、すべてのユーザーが同じ会社に属しているまれなケースですが、"all Users"管理者以外の会社の所有者に対してもメソッドが呼び出されることが望ましいでしょうか?

したがって、クラスですでに行っているように、役割を直接確認することをお勧めしますAbilities。しかし、私はあなたの痛みを感じます。;)

于 2013-08-13T13:31:09.593 に答える
0

コントローラーのアクションでは、次のようにする必要があります。

#load @user variable 
begin
  authorize! :manage, @user
  #code when access is granted
rescue CanCan::AccessDenied
  #code when access is denied
end
于 2013-08-13T13:43:58.650 に答える