【问题标题】:Get username using CRaSH command in Spring boot在 Spring Boot 中使用 CRaSH 命令获取用户名
【发布时间】:2016-05-23 14:23:21
【问题描述】:

小故事:如何将 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 的会话中。然后它进入外壳,我尝试了我的任何一个命令。通过在FooCommandmain() 中设置断点,我发现应该有之前发送的身份验证请求的上下文已经消失了。显然,在我输入命令之前,接收、处理和返回身份验证的 Spring 会话已经结束。

【问题讨论】:

    标签: java spring spring-boot crash-shell


    【解决方案1】:

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

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

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

    接下来您必须在src/main/resources/commands/crashdocumentation 中创建login.groovy(即使您有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

    【讨论】:

    • @JerryYeh 如果它对你有用,请接受这个答案,以便将来搜索这个的人
    • 不幸的是,我不再从事该项目,因此无法再访问它。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2015-04-15
    • 1970-01-01
    • 2021-09-13
    • 2020-01-28
    相关资源
    最近更新 更多