2016-05-23 63 views
2

小故事:如何将用于CRaSH shell的ssh连接器的用户名传递给定制的Java方法?不太短的故事:我为Spring创建了一组自定义shell命令。身份验证通过ssh连接器完成,输入用户名和密码,如ssh [email protected] -p 2000。它在Spring中进入认证策略,并相应通过或拒绝。在Spring引导中使用CRaSH命令获取用户名

现在经过授权并进入shell之后,我需要获取usename来运行一些函数。在这种情况下,我需要找出如何将foobarUsername传递到我创建的java方法中,该方法使用@Command注释并使用BaseCommand扩展。

我的Java实现,这是后来被一个Groovy脚本崩溃扩展:

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

的SSH连接器是这样的: ssh [email protected] -p 2000

更新: 默认情况下,我的shell命令的认证是由Spring自己的AuthenticationManager完成的。当我通过SSH发送请求时,身份验证在Spring的会话中进行。然后它进入shell,我尝试了我的任何一个命令。通过在FooCommandmain()中放置一个断点,我发现应该具有之前发送的认证请求的上下文已经消失。很显然,接受,处理和返回认证的Spring会话在我输入命令之前就已经结束了。

回答

1

首先你必须实现CRLSH认证插件,如in documentation所述。 在插件中,您可以访问上下文的属性和用户名。将用户名保存为属性

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

属性在所有用户之间共享。这在理论上是可能的,你把它的会话

接下来,您必须创建login.groovy(即使你有Java项目)文件中src/main/resources/commands/crashdocumentation之前覆盖的用户名。

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

哪里Application是我的应用程序类和条幅是我banner.txt。您可以复制login.groovy from spring boot并添加两行username变量。

现在我们在shell会话中有用户名。你可以用它在你指挥

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

improvement on jira

+0

谢谢,Mateusz! –

+0

@JerryYeh如果它适合你,请接受这个答案,以便将来搜索这个的人 – Mateusz

+0

不幸的是,我不再在该项目上工作,所以无法再访问它。 :( –

相关问题