在Spring boot

时间:2016-05-23 14:23:22

标签: java spring spring-boot crash-shell

简短的故事:如何将CRaSH shell的ssh连接器中使用的用户名传递给自定义的Java方法?

不那么短的故事:我为Spring创建了一组自定义shell命令。身份验证是通过ssh连接器完成的,其中输入了用户名和密码,如ssh foobarUsername@localhost -p 2000。它在Spring中进入了身份验证策略,并相应地通过或拒绝。

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

我的Java实现,后来由CRaSH的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 foobarUsername@localhost -p 2000

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

1 个答案:

答案 0 :(得分:1)

首先,您必须按照in documentation所述实现CRaSH身份验证插件。 在插件中,您可以访问上下文的属性和用户名。只需将用户名保存到属性

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

属性在所有用户之间共享。理论上,在将用户名置于会话

之前,可以覆盖用户名

接下来,您必须在login.groovydocumentation中创建src/main/resources/commands/crash(即使您有Java项目)文件。

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