2016-08-02 12 views
1

In meiner Schiene App verwende ich devise zur Authentifizierung und mein Modell Name ist user für die ich ein boolesches Feld admin haben. In meinem routes.rb versuche ich, alle Benutzer außer Admins zu beschränken, auf eine URL zuzugreifen.Erlauben Sie nur Admin-Benutzer Zugriff auf eine resque Web-Schnittstelle

mount Resque::Server.new, :at => "/resque" 

. Ich habe versucht, current_user Helfer devise wie

mount Resque::Server.new, :at => "/resque" if current_user.admin == true 

bekam aber den Fehler undefined local variable or method 'current_user' for #<ActionDispatch::Routing::Mapper:0x000000053ac780> (NameError) verwenden. Wie macht man das? Ich bin bitte

+0

Ihre Routen wissen nicht gearbeitet ist über Sitzungen oder angemeldeten Benutzer. – Alfie

Antwort

0

schließlich das, was für mich

# routes.rb 
    match "/resque" => Resque::Server, :anchor => false, :constraints => lambda { |req| 
    req.env['warden'].authenticated? and req.env['warden'].user.is_admin? 
    } 

    # user.rb 
    class MUserLogin < ActiveRecord::Base 
    . 
    . 
    . 
    def is_admin? 
     # your admin logic here for example: 
     self.admin == true 
    end 
    end 
1

Die beste Lösung für diese Art von Verhalten zu den Schienen helfen ist ein before_action zu Ihrem Controller hinzuzufügen, die einen Fehler erzeugen, wenn die Nutzer kein Admin ist:

before_action: authorize_admin_only

def authorize_admin_only 
    raise RoutingError.new('Not found') if !current_user.admin 
end 

Ihre Routes-Datei wird beim Start einmal interpretiert, und selbst wenn Sie Wege finden, um Routen abhängig von der Anfrage zu machen (zB mit routing_filter), ist es keine gute Idee, dies für Autorisierungszwecke zu verwenden.

In können Sie auch eine Fehlerdatei rendern oder den Benutzer einfach auf eine andere Seite umleiten, z. Anmeldung.

Für Ihren speziellen Fall, wie Sie einen anderen Motor montieren möchten, können Sie auch die Authentifizierung auf einem admin Modell definieren in your routes (und special resque example)

authenticate :admin_user do #replace admin_user(s) with whatever model your users are stored in. 
    mount Resque::Server.new, :at => "/jobs" 
    end 

Wenn Sie nicht ein Admin-Modell haben, können Sie dann verweisen auf the devise documentation for authenticate und etwas tun, wie folgt aus:

authenticate(:user, &:admin?) do 
    mount Resque::Server.new, :at => "/jobs" 
end 

(&:admin? produzieren das gleiche Ergebnis wie lambda{|user| user.admin?}, entfernen Sie die ?, wenn Sie di d nicht so alias definieren)

+0

Ich versuche das Webinterface von resque gem zu mounten. Also kann ich das nicht tun –

+0

@TonyVincent Ich habe ein Beispiel gefunden, um Devise auf diese Weise zu verwenden, obwohl Sie auch 'routing_filter' verwenden und einen benutzerdefinierten Filter definieren können :) – Geoffroy

+0

Das Problem ist, gibt es kein separates admin_user-Modell, was ich habe ein Benutzermodell mit einem booleschen Feld 'admin' –