当前位置: 首页 > 知识库问答 >
问题:

在Spring SFTP上设置首选身份验证方法

曹驰
2023-03-14

我正在尝试通过Spring Boot建立一个SFTP连接。我使用的是密码身份验证而不是私钥。当我启动应用程序时,它首先尝试通过gssapi-with-mic进行身份验证,然后Kerberos提示输入凭据。在我通过Kerberos按键之后,应用程序就会尝试寻找私钥。在没有找到关于密钥的任何细节之后,它将最终尝试提供给会话工厂的凭据,并按预期工作。由于这个应用程序将生活在Docker构建中,我需要它首先尝试密码验证。

此时,我尝试设置会话属性,将AllowUnkownKeys设置为false,并将其完全删除,但没有成功。

@SpringBootApplication
public class SFTPConnector {


public static void main(String[] args){
    new SpringApplicationBuilder(SFTPConnector.class).run(args);
}

@Bean
Properties configProperties(){
    Properties config = new Properties();
    config.setProperty("PreferredAuthenticationMethod", "PASSWORD");
    return config;
}

@Bean(name = PollerMetadata.DEFAULT_POLLER)
public PollerMetadata defaultPoller(){
    System.out.println("Initializing Poller");
    PollerMetadata pollerMetadata = new PollerMetadata();
    pollerMetadata.setTrigger(new PeriodicTrigger(6000));
    return pollerMetadata;
}
@Bean
SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory(){
    System.out.println("Creating Session");
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
    factory.setHost("someSFTPServer");
    factory.setUser("user");
    factory.setPassword("SomePassword");
    factory.setPort(22);
    factory.setAllowUnknownKeys(true);
    factory.setSessionConfig(configProperties());
    return new CachingSessionFactory<ChannelSftp.LsEntry>(factory);
}
@Bean
SftpInboundFileSynchronizer sftpInboundFileSynchronizer(){
    System.out.println("In File Synchronizer");
    SftpInboundFileSynchronizer fileSync = new SftpInboundFileSynchronizer(sftpSessionFactory());
    fileSync.setDeleteRemoteFiles(false);
    fileSync.setRemoteDirectory("SomeDir");
    fileSync.setFilter(new SftpSimplePatternFileListFilter("*.csv"));
    return fileSync;
}
@Bean
@InboundChannelAdapter("sftpChannel")
public MessageSource<File> sftpMessageSource(){
    System.out.println("Inside SFTP Message Source");
    SftpInboundFileSynchronizingMessageSource source = new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
    source.setLocalDirectory(new File("/tmp/local_inbound"));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
MessageHandler messageHandler(){
    System.out.println("Inisde Message Handler");
    return new MessageHandler() {
        @Override
        public void handleMessage(Message<?> arg0) throws MessagingException {
                File f = (File) arg0.getPayload();
                System.out.println(f.getName());
        }
    };
}

}`

我得到了:019-01-04 11:22:30.938信息11240---[ask-scheduler-1]com.jcraft.jsch:SSH_MSG_NEWKEYS已发送2019-01-04 11:22:30.938信息11240---[ask-scheduler-1]com.jcraft.jsch:SSH_MSG_NEWKEYS收到2019-01-04 11:22:30.943信息11240---[ask-scheduler-1]com.jcraft.jsch:SSH_MSG_SERVICE_REQUEST已发送2019-01-04 11:22:30.948信息11240---[ask-scheduler-1]com.jcraft.jsch:SSH_MSG_SERVICE_ACCEPT已接收2019-01-04 11:22:30.952信息11240---[ask-scheduler-1]com.jcraft.jsch:可以继续的身份验证:gssapi-with-mic,publickey,keyboard-interactive,password 2019-01-04 11:22:30.953 INFO 11240---[ask-scheduler-1]com.jcraft.jsch:下一个身份验证方法:gssapi-with-mic Kerberos用户名[bradley.dudra]:bradley.dudra:2019-01-04 11:34:28.546 INFO 11240---[ask-scheduler-1]com.jcraft.jsch:可以继续的身份验证:publickey,keyboard-interactive,password 2019-01-04 11:34:28.547 INFO 11240---[ask-scheduler-1]com.jcraft.j sch:下一个身份验证方法:publickey 2019-01-04 11:34:28.548 INFO 11240---[ask-scheduler-1]com.jcraft.jsch:可以继续的身份验证:password 2019-01-04 11:34:28.548 INFO 11240---[ask-scheduler-1]com.jcraft.jsch:下一个身份验证方法:password

在这一点之后,身份验证工作。我需要从一开始就省略通过密码进行身份验证的尝试。

共有1个答案

能业
2023-03-14

我认为您在会话配置中的属性错误:请尝试使用以下选项:

config.setProperty("PreferredAuthentications", "password");

请查看此处支持的属性

 类似资料:
  • 问题内容: 我想我丢失了一些东西,因为我在文档中找不到如何编写供Redis实例与sidekiq一起使用的用户名和密码。 有没有办法做到这一点?还是通过ENV变量? 问题答案: Sidekiq将无法识别的redis选项直接传递给Redis驱动程序: Redis没有用户的概念,因此只有密码。

  • 谁能向我解释一下,为了添加Django用户配置文件并成功验证本地运行的LDAP服务,无论是OpenLDAP还是Active Directory(如果可能的话,我需要知道如何成功设置后者),我需要采取哪些步骤?

  • 我正在尝试在 Swift 中创建一个 iOS 应用程序,该应用程序使用 AWS Lambda 使用以下身份验证服务 - https://github.com/danilop/LambdAuth 它使用适用于 iOS 的 AWS 移动开发工具包与迪纳摩数据库和 Lambda 进行通信 - http://docs.aws.amazon.com/mobile/sdkforios/developergui

  • 问题内容: 我正在尝试使用kerberos / HTTP主机进行身份验证。使用Apache HttpClient作为我的客户端- 以及此源的略微修改版本。 我的Kerberos身份验证非常顺利,我希望知道如何以编程方式设置登录凭据。目前,凭据是通过控制台手动输入的,但是我想在运行时选择它。[实际上,正如我希望对大量用户进行自动化和负载测试的服务器。]。 编辑:这是相关部分的代码片段: 该接口有两种

  • 问题内容: 因此,我目前正在运行已安装ldapjs的node.js。 我的目标是拥有一个使用ldapjs的系统,以允许用户使用用户名和密码登录。 我已经阅读了一段时间的http://ldapjs.org文档,但是正在努力理解ldap的整个思想以及ldapjs的实现。 我目前在文档中有这个 这使我可以运行以下内容并成功绑定到服务器。 但是我真的不确定从这里走到哪里,即使这是正确的方法… 理想的设置是

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工