在 Spring SFTP 上设置首选身份验证方法
Setting Preferred Authentication Method on Spring SFTP
我正在尝试通过 Spring Boot 建立 SFTP 连接。我正在使用密码身份验证而不是 PrivateKey。当我启动我的应用程序时,它首先尝试通过 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 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_NEWKEYS 已发送
2019-01-04 11:22:30.938 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_NEWKEYS 收到
2019-01-04 11:22:30.943 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_SERVICE_REQUEST 已发送
2019-01-04 11:22:30.948 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_SERVICE_ACCEPT 收到
2019-01-04 11:22:30.952 INFO 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 的 Kerberos 密码:
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.jsch :下一个身份验证方法:publickey
2019-01-04 11:34:28.548 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch :可以继续的身份验证:密码
2019-01-04 11:34:28.548 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch:下一个身份验证方法:密码
此时身份验证工作。
我需要从一开始就忽略通过密码进行身份验证的尝试。
我认为您的 属性 会话配置有误:
尝试以下操作:
config.setProperty("PreferredAuthentications", "password");
查看支持的属性Here
我正在尝试通过 Spring Boot 建立 SFTP 连接。我正在使用密码身份验证而不是 PrivateKey。当我启动我的应用程序时,它首先尝试通过 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 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_NEWKEYS 已发送 2019-01-04 11:22:30.938 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_NEWKEYS 收到 2019-01-04 11:22:30.943 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_SERVICE_REQUEST 已发送 2019-01-04 11:22:30.948 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch : SSH_MSG_SERVICE_ACCEPT 收到 2019-01-04 11:22:30.952 INFO 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 的 Kerberos 密码: 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.jsch :下一个身份验证方法:publickey 2019-01-04 11:34:28.548 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch :可以继续的身份验证:密码 2019-01-04 11:34:28.548 INFO 11240 --- [ask-scheduler-1] com.jcraft.jsch:下一个身份验证方法:密码
此时身份验证工作。 我需要从一开始就忽略通过密码进行身份验证的尝试。
我认为您的 属性 会话配置有误: 尝试以下操作:
config.setProperty("PreferredAuthentications", "password");
查看支持的属性Here