2

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

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

现在在被授权并进入 shell 之后,我需要获取用户名来运行一些功能。在这种情况下,我需要找出如何传递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 的会话中。然后它进入外壳,我尝试了我的任何一个命令。main()通过在of 中设置断点FooCommand,我发现应该有之前发送的身份验证请求的上下文已经消失了。显然,在我输入命令之前,接收、处理和返回身份验证的 Spring 会话已经结束。

4

1 回答 1

1

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

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

属性在所有用户之间共享。理论上可以在将其放入会话之前覆盖用户名

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

登录.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. 您可以从 spring boot 复制 login.groovy并添加两行username变量。

现在我们在 shell 会话中有用户名。你可以在你的命令中使用它

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

对jira的改进

于 2016-06-17T09:46:20.790 回答