Ich habe meinen gesamten Benutzer-Authentifizierungscode an einem Ort gespeichert, nämlich lib/auth.rb. Es sieht wie folgt aus:Abrufen der aktuellen Anfrage in Rails aus einer Datei in lib/
lib/auth.rb
module Admin
def do_i_have_permission_to?(permission)
# Code to check all of this goes here
end
end
ich dieses Modul als Teil des Anwendungs Helfer gehören, so sind diese Funktionen in allen Ansichten:
application_helper .rb
require 'auth'
module ApplicationHelper
include Admin
# other stuff here
end
Und ich schließe es auch als Teil der App lication Controller, so die Regler ebenfalls die Funktionen aufrufen:
application.rb
require 'auth'
class ApplicationController < ActionController::Base
include Admin
end
So weit, so gut.
Das Problem ist, dass meine Anwendung nicht wie eine normale Webanwendung ist. Insbesondere kann mehr als ein Benutzer gleichzeitig auf demselben Computer angemeldet sein (mit demselben Browser). Ich mache die Authentifizierung für Aktionen, indem ich alle Leute betrachte, die von dieser IP angemeldet sind, und wenn sie es alle können, passiert es.
Was das bedeutet ist, dass, wenn ein Admin etwas tun will, dieser Admin alle anderen zuerst ausloggen muss, was ärgerlich ist. Aber wir wollen das Admin-Gütesiegel für alles, was der Admin tut. Der Vorschlag, der mir gegeben wurde, bestand also darin, dass der Administrator auf jeder Seite, auf die er normalerweise keinen Zugriff hätte (z. B. eine 'Benutzer bearbeiten' Seite hätte diese zusätzlichen Eingabefelder), die Benutzername/Passwort-Kombination eingeben würde überprüfen Sie das. Dies bedeutet
Admin::do_i_have_permission_to?(permission)
muss an den aktuellen Anfrage-Parameter erhalten. Ich kann nicht einfach params [: foo] wie ich in einem Controller verwenden, weil params nicht definiert ist; Ähnlich request.parameters [: foo] wird auch nicht funktionieren. Meine Suche hat ergeben:
- Die aktuellen Suchparameter in der aktuellen Anforderung sind,
- Die aktuelle Anforderung ist im Stromregler,
- Der Stromregler ist im aktuellen Dispatcher und
- I bin mir nicht sicher, ob der aktuelle Dispatcher irgendwo aufbewahrt wird.
- Verschieben Sie einfach alle Funktionen derzeit in auth.rb in die ApplicationHelper wo (ich denke) sie haben Zugriff auf die Anfrage und so. Funktioniert, aber verstopft den Helfer aus der Hölle.
- Verschieben Sie alle Funktionen woanders werden sie diese Methoden sehen (Ich weiß nicht wo)
- Ich bin einfach nur etwas fehlt.
Das sagte, Erfahrung sagt mir, dass, wenn ich durch diese vielen Reifen spring, ich wahrscheinlich Doing It Wrong bin. Was ist der richtige Weg? Optionen, die ich in Betracht gezogen habe sind:
Ich hatte die Funktionalität in ein Modul getrennt, weil ich es wollte aus Sicht aufrufbar sein oder Controller (Ich habe das oben bearbeitet, um dies klarer zu machen) Ich tat wie vorgeschlagen und erstellt eine authentication_helper.rb-Datei mit allen oben genannten Funktionen, aber sie scheinen nirgendwo anders sichtbar zu sein. (Ich bekomme "NoMethodError" trotz "Helfer: Authentifizierung" in meinem Controller setzen) Für was es wert ist, der Grund, warum ich diese Funktionen möchte, so kann ich sie verwenden, wie Sie oben beschrieben haben, ich will nur sie verfügbar überall: Controller, Ansichten, Tests, etc. – Atiaxi
Ah, alle meine authentication_helper.rb Funktionen waren in einem eigenen Modul (AuthenticationHelper) - Putting 'Include AuthenticationHelper' wo es geeignet ist, es überall hin zu arbeiten, danke! – Atiaxi
Wenn Sie Hilfsmethoden möchten, die auch Controller-Methoden sind, benötigen Sie eine Reihe geschützter ApplicationController-Methoden, die mit dem Aufruf helper_method getaggt sind. Zum Beispiel: def is_user_admin? false Ende helper_method: is_user_admin? – tadman