2016-05-23 11 views
2

短編小説:CRaSHシェルのsshコネクタで使用されるユーザー名をカスタマイズされたJavaメソッドに渡すにはどうすればよいですか?SpringブートでCRaSHコマンドを使用してユーザー名を取得する

そんなに話がありません:私はSpring用のカスタムシェルコマンドセットを作成しました。認証は、ユーザ名とパスワードが入力されたsshコネクタを介して行われました(ssh [email protected] -p 2000のように)。それは春の認証ポリシーに入り、それに応じて合格または拒否されました。

今すぐ承認されてシェルに入ったら、いくつかの機能を実行するためにusenameを取得する必要があります。この場合、私が作成したJavaメソッドにfoobarUsernameを渡す方法を見つける必要があります。@Commandと注釈が付けられ、BaseCommandで拡張されています。

後のクラッシュのためのGroovyスクリプトによって拡張された私のJava実装、: ssh [email protected] -p 2000

更新:デフォルトでは 、sshのコネクタは、このようなものです

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*/); 
     }  
    } 

私のシェルコマンドの認証は、Spring自身のAuthenticationManagerによって行われました。 SSH経由でリクエストを送信した時点で、認証は春のセッションにありました。それから、それはシェルに入って、私は自分のコマンドのどれかを試しました。 main()のブレークポイントをFooCommandにすることで、以前に送信された認証要求があったはずのコンテキストがなくなったことがわかりました。私のコマンドを入力する前に、認証を受け、処理して返す春のセッションが終了したようです。

答えて

1

まず、in documentationのようにCRaSH認証プラグインを実装する必要があります。 プラグインでは、コンテキストの属性とユーザー名にアクセスできます。ただ、属性にユーザー名を保存する

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

属性は、すべてのユーザー間で共有されています。あなたが(あなたがJavaプロジェクトを持っている場合でも)、src/main/resources/commands/crashdocumentationファイルlogin.groovyを作成する必要がセッション

次にそれを置く前に、ユーザ名を上書きすることは理論的に可能です。

login.groovy:Applicationは私のアプリケーションクラスで、バナーが私のbanner.txtある

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 "> "; 
} 

login.groovy from spring bootをコピーし、usernameという変数で2行追加することができます。

シェルセッションにはユーザー名があります。あなたはあなたにそれを使用することができます

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

improvement on jira

+0

おかげで、はMateuszを命じます! –

+0

@JerryYeh将来的にこれを検索する人々のために、この回答を受け入れてください。 – Mateusz

+0

残念ながら、私はもはやそのプロジェクトに取り組んでいないので、もうアクセスできません。 :( –

関連する問題