ユーザーまたは管理者モデルと Basecamp スタイルのサブドメインを使用したログインを工夫する
-
26-09-2019 - |
質問
Devise ユーザーと管理者用に別のモデルを用意しています。Basecamp スタイルのサブドメインも使用しています。ユーザーまたは管理者として認証できる必要があるいくつかのコントローラーとアクションを除いて、すべてが正常に動作しています。
現在、私はauthenticate_userを持っています!application_controller.rb に設定し、管理者のみがアクセスできるコントローラーとアクションについては、skip_before_filter を使用してスキップしています。
残念ながら、ユーザーまたは管理者の両方がアクセスするにはいくつかのコントローラーとアクションが必要になるため、各コントローラーで認証要件を単純に指定することはできません。
いくつかのことを試しましたが無駄でした。どうやらauthenticate_userを移動するとそうなるようです!そしてauthenticate_admin!ある種のサブドメイン検出ロジックが処理に失敗します。基本的に:
current_subdomain = request.subdomains.first
if current_subdomain == 'admin'
authenticate_admin!
else
authenticate_user!
end
ある時点では、認証を試行することができましたが、何らかの理由でセッション コントローラーを認証の必要性から除外できず、リダイレクト ループが発生しました (Ruby を使用して初めて!)。
管理者ステータスを示すフィールドをユーザーに追加できることはわかっていますが、アプリケーションでは、いくつかのコントローラーとアクションを除いて、ユーザーと管理者の間の権限をそれができる以上に大きく分離する必要があります。
- ルビー 1.9.2
- レール 3.0.3
- 工夫1.1.3
解決
タグの線に沿って、あなた自身の前にフィルタを書いてみ
#application_controller.rb
def authenticate_any!
if admin_signed_in?
true
else
authenticate_user!
end
end
あなたは両方の管理者とユーザーが認証使用してアクセスすることができるようにしたいコントローラ内の
#myobject_controller.rb
before_filter :authenticate_any!
あなたは管理者としてログインしている場合、あなたがそうでなければ、あなたがauthenticate_userを通過します、before_filterを渡します!これはデフォルトの動作です。
他のヒント
実はこれにはない仕事ます:
#application_controller.rb
def authenticate_any!
if admin_signed_in?
true
else
authenticate_user!
end
end
これは、認証ユーザーに無限再帰を開始します..
の代わりにこれを試してください:
def authenticate_user!
return if admin_signed_in?
super
end
ただ、この第二の溶液を使用すると、このような何かを言っていることに注意してください: 「あなたはとしてログインする必要があり、少なくとも、ユーザ あなたはユーザーのみの認証を失うことになります。
管理者は、アクセスのすべてのことができるようになります。
ロールを処理するために追加の gem - CanCan を検討する必要があるかもしれません。
非常に素晴らしい説明がここにあります:http://www.tonyamoyal.com/2010/09/29/rails-authentication-with-devise-and-cancan-part-2-restful-resources-for-administrators/