2016-05-23 3 views
2

Kurzgeschichte: Wie kann ich den Benutzernamen, der in SSH-Connector der CRaSH-Shell verwendet wird, an die angepasste Java-Methode übergeben?Get username using CRaSH befehl in Spring boot

Nicht so kurze Geschichte: Ich habe eine Reihe von benutzerdefinierten Shell-Befehle für Spring erstellt. Die Authentifizierung erfolgte über den SSH-Connector, in dem ein Benutzername und ein Passwort eingegeben wurden, wie dieser ssh [email protected] -p 2000. Es ging im Frühjahr in die Authentifizierungsrichtlinie und wurde entsprechend übergeben oder abgelehnt.

Nun nachdem ich autorisiert und in die Shell gekommen bin, muss ich den Benutzernamen abrufen, um einige Funktionen auszuführen. In diesem Fall muss ich herausfinden, wie man foobarUsername in die von mir erstellten Java-Methoden übergibt, die mit @Command annotiert und um BaseCommand erweitert werden.

Meine Java-Implementierung, die später von einem groovigen Skript für CRASH erweitert:

public class FooCommand extends BaseCommand { 
     @Command 
     public void main(@Usage("do something") 
         @Required @Option(names = {"o", "option"}) String option) { 
      doSomething(option, username/* the username in ssh request*/); 
     }  
    } 

Der ssh-Anschluss ist wie folgt: ssh [email protected] -p 2000

Update: standardmäßig die Die Authentifizierung meines Shell-Befehls wurde von Spring AuthenticationManager durchgeführt. Zu der Zeit, als ich eine Anfrage per SSH gesendet habe, war die Authentifizierung in der Spring Session. Dann kam es in die Shell und ich probierte irgendeinen meiner Befehle aus. Indem ich einen Haltepunkt in main() von FooCommand setzte, fand ich, dass der Kontext weg war, der die Authentifizierungsanforderung hätte haben sollen, die vorher gesendet worden war. Anscheinend wurde die Spring-Sitzung des Empfangens, Verarbeitens und Zurückgebens der Authentifizierung beendet, bevor ich meinen Befehl eintrage.

Antwort

1

Als Erstes müssen Sie das CRaSH-Authentifizierungs-Plugin wie beschrieben in documentation implementieren. Im Plugin haben Sie Zugriff auf die Attribute und den Benutzernamen des Kontextes. Speichern Sie einfach Benutzernamen Attribute

getContext().getAttributes().put("username", username); 

Attribute werden zwischen allen Benutzern gemeinsam genutzt. Es ist theoretisch möglich, Benutzernamen außer Kraft zu setzen, bevor Sie es zu Sitzung setzen

Weiter Sie haben login.groovy zu erstellen (auch wenn Sie Java-Projekt haben) Datei in src/main/resources/commands/crash, documentation.

login.groovy:

welcome = { -> 
    def hostName; 
    try { 
     hostName = java.net.InetAddress.getLocalHost().getHostName(); 
    } catch (java.net.UnknownHostException ignore) { 
     hostName = 'localhost'; 
    } 

    String banner =  Application.getResourceAsStream('/banner.txt').text 
    String username =  this.binding.variables.crash.context.attributes.username 
    this.binding.variables.shell.context.session.username = username 


    return """ 
${banner} 
Logged into $hostName @ ${new Date()} 
""" 
} 

prompt = { -> 
    return "> "; 
} 

Wo Application meine Anwendungsklasse ist und Banner ist mein banner.txt. Sie können login.groovy from spring boot kopieren und zwei Zeilen mit username Variable hinzufügen.

Jetzt haben wir Benutzername in Shell-Sitzung. Sie können es verwenden in Ihnen

String username = context.getSession().get("username").toString(); 

improvement on jira

+0

Danke, Mateusz Befehl! –

+0

@JerryYeh Wenn es für dich funktioniert, akzeptiere bitte diese Antwort für Leute, die das in Zukunft suchen werden – Mateusz

+0

Leider arbeite ich nicht mehr an diesem Projekt, habe also keinen Zugriff mehr darauf. :( –