Skip to content

Commit

Permalink
perf($Starter): abstract SFTP and web security configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
johnnymillergh committed Jan 29, 2021
1 parent 9687151 commit 3306ec4
Show file tree
Hide file tree
Showing 3 changed files with 113 additions and 87 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,7 @@
import com.jmsoftware.maf.springbootstarter.redis.RedisConfiguration;
import com.jmsoftware.maf.springbootstarter.service.CommonService;
import com.jmsoftware.maf.springbootstarter.service.impl.CommonServiceImpl;
import com.jmsoftware.maf.springbootstarter.sftp.SftpClientConfiguration;
import com.jmsoftware.maf.springbootstarter.sftp.SftpHelper;
import com.jmsoftware.maf.springbootstarter.sftp.SftpHelperImpl;
import com.jmsoftware.maf.springbootstarter.sftp.SftpSubDirectoryRunner;
import com.jmsoftware.maf.springbootstarter.sftp.*;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
Expand Down Expand Up @@ -70,7 +67,9 @@
@Import({
MyBatisPlusConfiguration.class,
RedisConfiguration.class,
Swagger2Configuration.class
Swagger2Configuration.class,
SftpConfiguration.class,
WebSecurityConfiguration.class
})
public class MafAutoConfiguration {
@PostConstruct
Expand Down Expand Up @@ -183,86 +182,4 @@ public RestTemplate restTemplate() {
log.warn("Initial bean: '{}'", RestTemplate.class.getSimpleName());
return new RestTemplate();
}

@Bean
public SftpClientConfiguration sftpClientConfiguration() {
log.warn("Initial bean: '{}'", SftpClientConfiguration.class.getSimpleName());
return new SftpClientConfiguration();
}

@Bean
public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory(SftpClientConfiguration sftpClientConfiguration) {
val factory = new DefaultSftpSessionFactory(true);
factory.setHost(sftpClientConfiguration.getHost());
factory.setPort(sftpClientConfiguration.getPort());
factory.setUser(sftpClientConfiguration.getUser());
if (sftpClientConfiguration.getPrivateKey() != null) {
factory.setPrivateKey(sftpClientConfiguration.getPrivateKey());
factory.setPrivateKeyPassphrase(sftpClientConfiguration.getPrivateKeyPassPhrase());
} else {
factory.setPassword(sftpClientConfiguration.getPassword());
}
factory.setAllowUnknownKeys(true);
// We return a caching session factory, so that we don't have to reconnect to SFTP server for each time
val cachingSessionFactory = new CachingSessionFactory<>(factory, sftpClientConfiguration.getSessionCacheSize());
cachingSessionFactory.setSessionWaitTimeout(sftpClientConfiguration.getSessionWaitTimeout());
log.warn("Initial bean: '{}'", cachingSessionFactory.getClass().getSimpleName());
return cachingSessionFactory;
}

@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
@SuppressWarnings("UnresolvedMessageChannel")
public MessageHandler messageHandler(SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory,
SftpClientConfiguration sftpClientConfiguration) {
val handler = new SftpMessageHandler(sftpSessionFactory);
handler.setRemoteDirectoryExpression(new LiteralExpression(sftpClientConfiguration.getDirectory()));
handler.setFileNameGenerator(message -> {
if (message.getPayload() instanceof File) {
return ((File) message.getPayload()).getName();
} else {
throw new IllegalArgumentException("File expected as payload.");
}
});
log.warn("Initial bean: '{}'", handler.getClass().getSimpleName());
return handler;
}

@Bean
public SftpRemoteFileTemplate sftpRemoteFileTemplate(SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory,
SftpClientConfiguration sftpClientConfiguration) {
val sftpRemoteFileTemplate = new SftpRemoteFileTemplate(sftpSessionFactory);
sftpRemoteFileTemplate.setRemoteDirectoryExpression(
new LiteralExpression(sftpClientConfiguration.getDirectory()));
sftpRemoteFileTemplate.setAutoCreateDirectory(true);
// sftpRemoteFileTemplate.setBeanFactory(beanFactory);
sftpRemoteFileTemplate.afterPropertiesSet();
log.warn("Initial bean: '{}'", sftpRemoteFileTemplate.getClass().getSimpleName());
return sftpRemoteFileTemplate;
}

@Bean
public SftpSubDirectoryRunner sftpSubDirectoryRunner(SftpRemoteFileTemplate sftpRemoteFileTemplate,
SftpClientConfiguration sftpClientConfiguration) {
log.warn("Initial bean: '{}'", SftpSubDirectoryRunner.class.getSimpleName());
return new SftpSubDirectoryRunner(sftpRemoteFileTemplate, sftpClientConfiguration);
}

@Bean
public SftpHelper sftpHelper(SftpRemoteFileTemplate sftpRemoteFileTemplate) {
log.warn("Initial bean: '{}'", SftpHelper.class.getSimpleName());
return new SftpHelperImpl(sftpRemoteFileTemplate);
}

@Bean
public WebSecurityConfiguration webSecurityConfiguration() {
log.warn("Initial bean: '{}'", WebSecurityConfiguration.class.getSimpleName());
return new WebSecurityConfiguration();
}

@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder() {
log.warn("Initial bean: '{}'", BCryptPasswordEncoder.class.getSimpleName());
return new BCryptPasswordEncoder();
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.jmsoftware.maf.springbootstarter.configuration;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import javax.annotation.PostConstruct;

/**
* <h1>WebSecurityConfiguration</h1>
Expand All @@ -19,6 +23,11 @@
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@PostConstruct
void postConstruct() {
log.warn("Initial bean: '{}'", WebSecurityConfiguration.class.getSimpleName());
}

@Override
public AuthenticationManager authenticationManager() throws Exception {
return super.authenticationManagerBean();
Expand All @@ -29,4 +38,10 @@ protected void configure(HttpSecurity http) throws Exception {
// Disable Web Security.
http.authorizeRequests().anyRequest().permitAll().and().csrf().disable().cors().disable();
}

@Bean
public BCryptPasswordEncoder bcryptPasswordEncoder() {
log.warn("Initial bean: '{}'", BCryptPasswordEncoder.class.getSimpleName());
return new BCryptPasswordEncoder();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.jmsoftware.maf.springbootstarter.sftp;

import com.jcraft.jsch.ChannelSftp;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.expression.common.LiteralExpression;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.file.remote.session.CachingSessionFactory;
import org.springframework.integration.file.remote.session.SessionFactory;
import org.springframework.integration.sftp.outbound.SftpMessageHandler;
import org.springframework.integration.sftp.session.DefaultSftpSessionFactory;
import org.springframework.integration.sftp.session.SftpRemoteFileTemplate;
import org.springframework.messaging.MessageHandler;

import java.io.File;

/**
* Description: SftpConfiguration, change description here.
*
* @author 钟俊(zhongjun), email: zhongjun@toguide.cn, date: 1/29/2021 2:09 PM
**/
@Slf4j
@Configuration
@Import({
SftpClientConfiguration.class
})
public class SftpConfiguration {
@Bean
public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory(SftpClientConfiguration sftpClientConfiguration) {
val factory = new DefaultSftpSessionFactory(true);
factory.setHost(sftpClientConfiguration.getHost());
factory.setPort(sftpClientConfiguration.getPort());
factory.setUser(sftpClientConfiguration.getUser());
if (sftpClientConfiguration.getPrivateKey() != null) {
factory.setPrivateKey(sftpClientConfiguration.getPrivateKey());
factory.setPrivateKeyPassphrase(sftpClientConfiguration.getPrivateKeyPassPhrase());
} else {
factory.setPassword(sftpClientConfiguration.getPassword());
}
factory.setAllowUnknownKeys(true);
// We return a caching session factory, so that we don't have to reconnect to SFTP server for each time
val cachingSessionFactory = new CachingSessionFactory<>(factory, sftpClientConfiguration.getSessionCacheSize());
cachingSessionFactory.setSessionWaitTimeout(sftpClientConfiguration.getSessionWaitTimeout());
log.warn("Initial bean: '{}'", cachingSessionFactory.getClass().getSimpleName());
return cachingSessionFactory;
}

@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
@SuppressWarnings("UnresolvedMessageChannel")
public MessageHandler messageHandler(SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory,
SftpClientConfiguration sftpClientConfiguration) {
val handler = new SftpMessageHandler(sftpSessionFactory);
handler.setRemoteDirectoryExpression(new LiteralExpression(sftpClientConfiguration.getDirectory()));
handler.setFileNameGenerator(message -> {
if (message.getPayload() instanceof File) {
return ((File) message.getPayload()).getName();
} else {
throw new IllegalArgumentException("File expected as payload.");
}
});
log.warn("Initial bean: '{}'", handler.getClass().getSimpleName());
return handler;
}

@Bean
public SftpRemoteFileTemplate sftpRemoteFileTemplate(SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory,
SftpClientConfiguration sftpClientConfiguration) {
val sftpRemoteFileTemplate = new SftpRemoteFileTemplate(sftpSessionFactory);
sftpRemoteFileTemplate.setRemoteDirectoryExpression(
new LiteralExpression(sftpClientConfiguration.getDirectory()));
sftpRemoteFileTemplate.setAutoCreateDirectory(true);
// sftpRemoteFileTemplate.setBeanFactory(beanFactory);
sftpRemoteFileTemplate.afterPropertiesSet();
log.warn("Initial bean: '{}'", sftpRemoteFileTemplate.getClass().getSimpleName());
return sftpRemoteFileTemplate;
}

@Bean
public SftpSubDirectoryRunner sftpSubDirectoryRunner(SftpRemoteFileTemplate sftpRemoteFileTemplate,
SftpClientConfiguration sftpClientConfiguration) {
log.warn("Initial bean: '{}'", SftpSubDirectoryRunner.class.getSimpleName());
return new SftpSubDirectoryRunner(sftpRemoteFileTemplate, sftpClientConfiguration);
}

@Bean
public SftpHelper sftpHelper(SftpRemoteFileTemplate sftpRemoteFileTemplate) {
log.warn("Initial bean: '{}'", SftpHelper.class.getSimpleName());
return new SftpHelperImpl(sftpRemoteFileTemplate);
}
}

0 comments on commit 3306ec4

Please sign in to comment.