2


1

データベースを使用したRailsの動的ロール認証。 宣言的承認が最良の選択ですか?

動的な役割の割り当て(役割/特権)を提供する必要があります .More clearly, an end user should be able to create a role, assign 新しいユーザーへのアクセス許可。 そこで、各ユーザーのテーブルにロールと特権を保存することを考えていました。

これを行うスマートな方法はありますか(他のプラグイン?)、または宣言的承認でこれを行うコードを書く必要がありますか? いくらかの光が役立つでしょう。ありがとう!

3 Answer


1


これらに答えて、解決策に近づいてみてください。

  1. 役割自体は動的ですか? i.e. 特権を割り当てることができますか さまざまな役割は、管理者がWebインターフェースから変更できますか? はいの場合、この情報をデータベースに保存する必要があります。 ブログのようなシステムの場合、役割が事前に定義されています。 管理者、ゲスト、モデレーター、宣言的承認は魅力のように機能します。

  2. UIへのアクセス許可の結合はどれくらい強力ですか? (時々それ 制限する必要があるのは2、3の場所だけです。他の場合、ソーシャルネットワークのように、権限ははるかに複雑で、UIと密接に結びついています。 非常に密に結合している場合、つまり 1つのアクションはあらゆる種類のロールで使用できますが、これらのロールが実行するアクションは定義によって制限されます。そのため、宣言的承認(または同類)はあまり役に立ちません。レガシーシステムが必要です。


1


最近プロジェクトでhttp://github.com/ryanb/cancan[CanCan]を使用しましたが、それはかなりクールだと思います。 Abilityクラスを作成し、それを使用して、ユーザーがアクションを実行できるかどうかを決定します…​ メソッドのテーブルにアクセス許可があるかどうか、またはそのルールセットがアクションを許可しているかどうかを確認できます。

このサンプルコードはすべてgithubのreadmeから取得しました。

class Ability
  include CanCan::Ability

  def initialize(user)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

次に、ビューとコントローラーで認証レベルを確認できます

<% if can? :update, @article %>
  <%= link_to "Edit", edit_article_path(@article) %>
<% end %>


def show
  @article = Article.find(params[:id])
  authorize! :read, @article
end


1


Cancanは、単純なプロジェクトや開始プロジェクトに最適ですが、モノリシックアプリを使用している場合は、完全にラップする必要があります。 Cancanは初期の解決策であり、最終的な解決策ではありません。 ポリシーオブジェクト(評論家)を見ると、コードの匂いがする場合があります。独自の承認モデルを構築する必要があります。 統合のような承認はクライアントごとに異なります。より動的なソリューションを探している場合や、あまりにも多くの役割を持っている場合、cancanはあなたには適していません。 よりデータ駆動型のセキュリティモデルが必要になる場合があります。 たとえば、他の誰かにエンティティへのアクセスを許可できる場合。