gpt4 book ai didi

java - 在 Spring boot 中使用 CRaSH 命令获取用户名

转载 作者:行者123 更新时间:2023-11-30 10:44:25 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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 是我的 banner.txt。你可以复制login.groovy from spring boot并添加两行 username 变量。

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

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

improvement on jira

关于java - 在 Spring boot 中使用 CRaSH 命令获取用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37393604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com