2017-03-27 11 views
0

私は自分のアプリケーションの役割ベースのアクセスコントロールユニットを実装しようとしていますが、自分の制約を受けてそれを行う方法はわかりません。異なるユーザータイプのルールベースのアクセスコントロールユニットを作成する方法

私はサインイン/アップ操作にDeviseを使用します。モデルユーザーは1人だけですが、すべてのユーザーに異なるuser_typeがあります。私は、異なる認証レベル(整数)を持つ8つの一意のユーザータイプを持っています。

これらは、ユーザーがサイトとの対話方法に制約されている:高い認証レベルで

  1. ユーザーが低く認証レベルの機能とそれに関連するユーザーの種類、すなわち、それらに関連するコントローラへのアクセスを実行し、ものを行うことができます。 auth_level = 2user1は、コントローラC1にアクセスすることができますが、同じauth_level = 2user2はコントローラC2にアクセスすることができます。

  2. 同じ認証レベルを持つすべてのユーザーのタイプは、同じコントローラにアクセスできるわけではありません。他の方法は、彼らは同じレベルで別の仕事をしているということです。

  3. このようなことを実現する宝石はありますか?私はCanCanを見てきましたが、私のニーズを満たしていません。

  4. 宝石がない場合、そのようなアクセス制御ユニットを実装するにはどのようなアプローチ/デザインをお勧めしますか?
+0

[ask]とリンクされたページをお読みください。あなたはあなたの環境やニーズについて十分に話していないので、あなたの質問は幅広いです。あなたはオフサイトのリソースのためにあなたに推奨事項を教えてくれるように頼んでいます。代わりに、あなたは研究を行い、物事を試してから、あなたに最適なものを決定し、コードを書いてから問題があれば、その問題について特定の質問をする必要があります。 –

答えて

0

は、いくつかの時間のために私は周りと私の目的のために、適した利用できる宝石を評価するだろうが、私は自分のアプリケーションにインポートするのに十分な任意のsimpleeasy-to-uselightweightを見つけることができませんでした。だから、私は戦いを受け入れ、質問に私の制約を満たすという名前の自分の宝石を書いた+それは非常に軽量で使いやすく、あらゆる目的のために一般的です。

この宝石では、すべてのリクエストが通過するかどうか、アクセスルールはレールアプリのあらゆる側面をカバーできます。以下はルールセットの例です。詳細はhereで提供されているドキュメントを参照してください。

# config/initializers/acu_rules.rb 
Acu::Rules.define do 
    # anyone makes a request could be count as everyone! 
    whois :everyone { true } 

    whois :admin, args: [:user] { |c| c and c.user_type == :ADMIN.to_s } 

    whois :client, args: [:user] { |c| c and c.user_type == :CLIENT.to_s } 

    # any request that doesn't match with a rule will be denied by default; 
    # but this can be configured to not to! 

    # the default namespace 
    namespace do 
    controller :home, except: [:some_secret_action] do 
     allow :everyone 
    end 
    controller :home do 
     allow [:admin, :client], on: [:some_secret_action] 
    end 
    end 

    # the admin namespace 
    namespace :admin do 
    allow :admin 

    controller :contact, only: [:send_message] do 
     allow :everyone 
    end 

    controller :contact do 
     action :support { 
     allow :client 
     } 
    end 
    end 
end 
1

コントローラのアクセスを実装するためにRoute Constraints(http://guides.rubyonrails.org/routing.html#advanced-constraints)を使用することをお勧めします。

request.env["warden"].authenticateを使用すると、制約クラスのmatches?メソッド内のリクエストに対して、現在のユーザーを認証できます。 request.env["warden"].authenticate!を使用する場合は、ユーザーをログインページにリダイレクトするか、適切なエラーメッセージを表示します(設定に応じて)。私は数日前にこの質問をしたので

+1

推奨しないでください。 https://meta.stackoverflow.com/a/341780/128421 –

関連する問題