2011-01-06 29 views
4

私は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
  • のRails 3.0.3
  • 工夫たぶん1.1.3

答えて

13

彼の認証使用することにより、あなたは両方の管理者とユーザーがアクセス権を持つことができるようにしたいコントローラで、その後

#application_controller.rb 
def authenticate_any! 
    if admin_signed_in? 
     true 
    else 
     authenticate_user! 
    end 
end 

#myobject_controller.rb 
before_filter :authenticate_any! 

あなたが管理者としてログインしている場合、あなたが通過しますのラインbefore_filter、それ以外の場合はauthenticate_userを実行します!これはデフォルトの動作です。これが動作しない

10

実際:

#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 

はちょうどこの二であることを覚えていますあなたはこのような何かを言っている: 'あなたは少なくとも、ユーザーとしてログインする必要があります' とあなたは本物を失うでしょうユーザーのオンのみ。

管理者はすべてにアクセスできます。

関連する問題