2016-06-24 12 views
0

Ich baue Symfony Application, die Konsolenbefehle verwenden. Derselbe Konsolenbefehl kann aus Controller-Thru-Ereignissen ausgeführt werden, aber er kann auch vom Terminal aus ausgeführt werden. Wie kann ich herausfinden, wo der Befehl ausgeführt wurde, damit ich die Benutzerauthentifizierung implementieren kann, wenn der Befehl vom Terminal aus ausgeführt wurde? Wenn der Befehl vom Controller ausgeführt wurde, hat der Benutzer bereits die Berechtigung zum Ausführen. Aber wenn es vom Terminal aus ausgeführt wurde, muss er sich mit Benutzernamen und Passwort authentifizieren, damit ich überprüfe, ob er die notwendige Rolle hat?Symfony - wie kann man wissen, ob der Konsolenbefehl vom Controller ausgeführt wurde oder vom Terminal ausgeführt wurde?

+0

Sollten Sie gerade nicht, wenn Benutzer angemeldet ist? –

+4

Konsolenbefehle sollen nicht aus dem Internet ausgeführt werden. Übrigens, wenn jemand Zugriff auf das Terminal hat, ist eine Berechtigungsprüfung wahrscheinlich nutzlos, da er Zugriff auf alle Dateien hat. – tkausl

+0

Ich führe einen Befehl von pheanstalk aus, um Daten in infuxDB zu aktualisieren. Aber ich möchte eine Option hinzufügen, um Befehl für Terminal auszuführen, wenn das Update nicht korrekt ausgeführt wird oder wenn etwas schief läuft. Aber er muss sich authentifizieren und ich muss nach einer Rolle suchen. Es gibt zusätzliche Sicherheit auf dem Server, um den Zugriff durch IP zu beschränken, so dass es kein Problem damit gibt. Aber es gibt viele Mitarbeiter mit Zugriff von internen IP, so dass ich nicht möchte, dass der Befehl von jemandem ausgeführt wird, der nicht sicher ist, was er tut. – sanof

Antwort

0

Die Symfony Konsolenanwendung hat keine Firewall-Ebene wie der HttpKernel.

Die Konsolenkomponente wurde für kleine "Admin-ähnliche" Aufgaben erstellt, nicht für einzelne Benutzer.

Das ganze Problem könnte durch die Implementierung eines Befehlsbusmusters gelöst werden.

Der "Befehl" wird vom Web-Controller erstellt, der gesichert ist und einen Benutzer und im CLI-Befehl (für Crontab) ohne Sicherheitsüberprüfungen hat.

Anschließend wird es an den Befehlsbus übergeben, der an den Befehlshandler übergeben wird.

Der Handler enthält die aktuelle Logik der execute-Methode. Das Befehlsobjekt würde alle Daten enthalten, um diese Logik auszuführen == Ihre aktuellen Eingabeargumente und Optionen.

Der Symfony-Befehl ist danach sehr schlank, als würden Sie nur Eingabeargumente an den Befehls-Handler übergeben. Wie es sein sollte.

Wenn es sich um eine lange laufende Aufgabe handelt, könnte sie sogar von der Web-Anfrage in eine Worker-Warteschlange ausgelagert werden.

Bitte beachten Sie die Namenskollision. Ein symfony Konsolenbefehl! == Befehl bus command hier.

Zum Beispiel könnten Sie SIMPLEBUS innerhalb Symfony verwenden: https://github.com/SimpleBus

Auch die letzten Blog-Post auf der Namensgebung Ausgabe von @skoop: http://leftontheweb.com/blog/2016/06/18/Command-or-Controller/

6

Sie können überprüfen, ob Ihr Befehl von der Konsole ausgeführt wurde oder von einem Controller mit php_sapi_name() function or PHP_SAPI constant (die php_sapi_name ähnlich ist())

if ('cli' === PHP_SAPI) { 
    // command was run from the console 
} else { 
    // command was run from a controller 
} 
Verwandte Themen