v 1.5.0 RC2

v 1.5.0 RC2
This commit is contained in:
shimingxy
2020-05-16 11:54:58 +08:00
parent 7c180f33be
commit e33c6dfd0b
37 changed files with 931 additions and 1209 deletions

View File

@@ -248,6 +248,7 @@ subprojects {
//database //database
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.48' compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.48'
compile group: 'com.alibaba', name: 'druid', version: '1.1.21' compile group: 'com.alibaba', name: 'druid', version: '1.1.21'
compile group: 'com.alibaba', name: 'druid-spring-boot-starter', version: '1.1.21'
compile group: 'redis.clients', name: 'jedis', version: '3.2.0' compile group: 'redis.clients', name: 'jedis', version: '3.2.0'
compile group: 'org.ehcache', name: 'ehcache', version: '3.8.1' compile group: 'org.ehcache', name: 'ehcache', version: '3.8.1'
//mybatis //mybatis

View File

@@ -5,9 +5,9 @@ author =shimingxy
#Version For use jar #Version For use jar
jackson2Version =2.9.8 jackson2Version =2.9.8
log4jVersion =2.13.2 log4jVersion =2.13.2
springVersion =5.2.5.RELEASE springVersion =5.2.6.RELEASE
springBootVersion =2.2.6.RELEASE springBootVersion =2.3.0.RELEASE
springSecurityVersion =5.3.0.RELEASE springSecurityVersion =5.3.2.RELEASE
hibernateVersion =6.1.2.Final hibernateVersion =6.1.2.Final
slf4jVersion =1.7.30 slf4jVersion =1.7.30
jacksonVersion =2.10.3 jacksonVersion =2.10.3

View File

@@ -41,4 +41,9 @@ public class RedisRemeberMeService extends AbstractRemeberMeService {
conn.close(); conn.close();
} }
public void setConnectionFactory(RedisConnectionFactory connectionFactory) {
this.connectionFactory = connectionFactory;
}
} }

View File

@@ -21,8 +21,7 @@ import org.springframework.stereotype.Component;
@PropertySource("classpath:/config/applicationConfig.properties") @PropertySource("classpath:/config/applicationConfig.properties")
public class ApplicationConfig { public class ApplicationConfig {
private static final Logger _logger = LoggerFactory.getLogger(ApplicationConfig.class); private static final Logger _logger = LoggerFactory.getLogger(ApplicationConfig.class);
@Autowired
DataSoruceConfig dataSoruceConfig;
@Autowired @Autowired
EmailConfig emailConfig; EmailConfig emailConfig;
@Autowired @Autowired
@@ -45,8 +44,8 @@ public class ApplicationConfig {
@Value("${config.server.default.uri}") @Value("${config.server.default.uri}")
String defaultUri; String defaultUri;
@Value("${config.server.manage.uri}") @Value("${config.server.management.uri}")
String manageUri; String managementUri;
/* /*
* //is enable whiteList for ipAddress filter boolean whiteList; * //is enable whiteList for ipAddress filter boolean whiteList;
@@ -80,14 +79,6 @@ public class ApplicationConfig {
} }
public DataSoruceConfig getDataSoruceConfig() {
return dataSoruceConfig;
}
public void setDataSoruceConfig(DataSoruceConfig dataSoruceConfig) {
this.dataSoruceConfig = dataSoruceConfig;
}
/** /**
* @return the characterEncodingConfig * @return the characterEncodingConfig
*/ */
@@ -179,12 +170,12 @@ public class ApplicationConfig {
this.emailConfig = emailConfig; this.emailConfig = emailConfig;
} }
public String getManageUri() { public String getManagementUri() {
return manageUri; return managementUri;
} }
public void setManageUri(String manageUri) { public void setManagementUri(String managementUri) {
this.manageUri = manageUri; this.managementUri = managementUri;
} }
public String getDefaultUri() { public String getDefaultUri() {

View File

@@ -12,25 +12,25 @@ import org.springframework.context.annotation.PropertySource;
* *
*/ */
@Configuration @Configuration
@PropertySource("classpath:/config/applicationConfig.properties") @PropertySource("classpath:/application.properties")
public class CharacterEncodingConfig { public class CharacterEncodingConfig {
/** /**
* 源字符集. * 源字符集.
*/ */
@Value("${config.characterencoding.charset.from}") @Value("${server.servlet.encoding.charset.from:UTF-8}")
String fromCharSet; String fromCharSet;
/** /**
* 目标字符集. * 目标字符集.
*/ */
@Value("${config.characterencoding.charset.to}") @Value("${server.servlet.encoding.charset:UTF-8}")
String toCharSet; String toCharSet;
/** /**
* 转换标志. * 转换标志.
*/ */
@Value("${config.characterencoding.encoding}") @Value("${server.servlet.encoding.enabled:false}")
boolean encoding = false; boolean encoding = false;
public CharacterEncodingConfig() { public CharacterEncodingConfig() {

View File

@@ -1,177 +0,0 @@
package org.maxkey.config;
import org.apache.commons.logging.LogFactory;
import org.apache.mybatis.jpa.dialect.Dialect;
import org.maxkey.crypto.password.PasswordReciprocal;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
/*
* 数据源配置.
*
* @author Crystal.Sea
* dataSource.driverClassName=com.mysql.jdbc.Driver
* dataSource.url=jdbc:mysql://192.168.1.49/parasecdb?autoReconnect=true&characterEncoding=UTF-8
* dataSource.username=root
* dataSource.password=connsec
* dataSource.type=mysql
*
*/
@Configuration
@PropertySource("classpath:/config/applicationConfig.properties")
public class DataSoruceConfig {
/*
* 数据库类型
*/
@Value("${config.datasource.database:mysql}")
String database;
/*
* jdbc驱动类
*/
@Value("${config.datasource.driverclass:com.mysql.jdbc.Driver}")
String driverClass;
/*
* jdbc连接地址
*/
@Value("${config.datasource.url:"
+ "jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8}")
String url;
/*
* 数据库用户名
*/
@Value("${config.datasource.username:root}")
String username;
/*
* 数据库密码
*/
@Value("${config.datasource.password:maxkey}")
String password;
/*
* 数据库密码是否加密
*/
@Value("${config.datasource.password.encrypt}")
boolean encrypt = false;
/*
* 数据库dialect for mybatis
*/
String dialect;
public DataSoruceConfig() {
super();
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
/**
* 取得数据库密码 如果是加密密码(encrypt==true),则进行解密.
*
* @return decodePassword
*/
public String getPassword() {
String decodePassword = "";
LogFactory.getLog(DataSoruceConfig.class).debug("password is " + password);
if (encrypt) {
decodePassword = PasswordReciprocal.getInstance().decoder(password);
} else {
decodePassword = password;
}
LogFactory.getLog(DataSoruceConfig.class)
.debug("password is " + password + " , decodePassword is " + decodePassword);
return decodePassword;
}
public void setPassword(String password) {
this.password = password;
}
/*
*
* @return the database
*/
public String getDatabase() {
return database;
}
/*
* @param database the database to set
*/
public void setDatabase(String database) {
this.database = database;
}
/*
* @return the driverClass
*/
public String getDriverClass() {
return driverClass;
}
/*
* @param driverClass the driverClass to set
*/
public void setDriverClass(String driverClass) {
this.driverClass = driverClass;
}
public boolean isEncrypt() {
return encrypt;
}
public void setEncrypt(boolean encrypt) {
this.encrypt = encrypt;
}
/**
* getDialect.
* @return the dialect
*/
public String getDialect() {
if (this.dialect == null) {
this.dialect = Dialect.getDialectMap().get(database);
}
return dialect;
}
/*
* @param dialect the dialect to set
*/
public void setDialect(String dialect) {
this.dialect = dialect;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "DataSoruceConfig [database=" + database
+ ", driverClass=" + driverClass
+ ", url=" + url
+ ", username=" + username
+ ", password=" + password
+ ", encrypt=" + encrypt
+ "]";
}
}

View File

@@ -5,24 +5,28 @@ import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
@Configuration @Configuration
@PropertySource("classpath:/config/applicationConfig.properties") @PropertySource("classpath:/application.properties")
public class EmailConfig { public class EmailConfig {
@Value("${config.email.username}") @Value("${spring.mail.username}")
private String username; private String username;
@Value("${config.email.password}")
@Value("${spring.mail.password}")
private String password; private String password;
@Value("${config.email.smtpHost}")
@Value("${spring.mail.host}")
private String smtpHost; private String smtpHost;
@Value("${config.email.senderMail}")
private String senderMail; @Value("${spring.mail.port}")
@Value("${config.email.port}")
private Integer port; private Integer port;
@Value("${config.email.ssl}")
@Value("${spring.mail.properties.ssl}")
private boolean ssl; private boolean ssl;
@Value("${spring.mail.properties.sender}")
private String sender;
public EmailConfig() { public EmailConfig() {
// TODO Auto-generated constructor stub
} }
/* /*
@@ -67,18 +71,14 @@ public class EmailConfig {
this.smtpHost = smtpHost; this.smtpHost = smtpHost;
} }
/*
* @return the senderMail
*/ public String getSender() {
public String getSenderMail() { return sender;
return senderMail;
} }
/* public void setSender(String sender) {
* @param senderMail the senderMail to set this.sender = sender;
*/
public void setSenderMail(String senderMail) {
this.senderMail = senderMail;
} }
/* /*

View File

@@ -0,0 +1,36 @@
package org.maxkey.config;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import java.io.IOException;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
@Configuration
public class KaptchaAutoConfiguration {
private static final Logger _logger = LoggerFactory.getLogger(KaptchaAutoConfiguration.class);
/**
* Captcha Producer Config .
* @return Producer
* @throws IOException kaptcha.properties is null
*/
@Bean (name = "captchaProducer")
public Producer captchaProducer() throws IOException {
Resource resource = new ClassPathResource("/kaptcha.properties");
_logger.debug("Kaptcha config file " + resource.getURL());
DefaultKaptcha kaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.load(resource.getInputStream());
Config config = new Config(properties);
kaptcha.setConfig(config);
return kaptcha;
}
}

View File

@@ -0,0 +1,187 @@
package org.maxkey.config;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.xml.MarshallingHttpMessageConverter;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Configuration
@PropertySource("classpath:/application.properties")
@PropertySource("classpath:/config/applicationConfig.properties")
public class MvcAutoConfiguration {
private static final Logger _logger = LoggerFactory.getLogger(MvcAutoConfiguration.class);
@Value("${config.server.domain.sub}")
String subDomainName;
@Value("${spring.servlet.multipart.max-file-size:4194304}")
int maxUploadSize;
@Value("${spring.messages.basename:classpath:messages/message}")
String messagesBasename;
/**
* cookieLocaleResolver .
* @return cookieLocaleResolver
*/
@Bean (name = "localeResolver")
public CookieLocaleResolver cookieLocaleResolver() {
_logger.debug("subDomainName " + subDomainName);
CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
cookieLocaleResolver.setCookieName("maxkey_lang");
cookieLocaleResolver.setCookieDomain(subDomainName);
cookieLocaleResolver.setCookieMaxAge(604800);
return cookieLocaleResolver;
}
/**
* 消息处理可以直接使用properties的key值返回的是对应的value值
* messageSource .
* @return messageSource
*/
@Bean (name = "messageSource")
public ReloadableResourceBundleMessageSource reloadableResourceBundleMessageSource() {
_logger.debug("Basename " + messagesBasename);
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setBasename(messagesBasename);
messageSource.setUseCodeAsDefaultMessage(false);
return messageSource;
}
/**
* Locale Change Interceptor and Resolver definition .
* @return localeChangeInterceptor
*/
//@Primary
@Bean (name = "localeChangeInterceptor")
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor =
new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
/**
* upload file support .
* @return multipartResolver
*/
@Bean (name = "multipartResolver")
public CommonsMultipartResolver commonsMultipartResolver() {
_logger.debug("maxUploadSize " + maxUploadSize);
CommonsMultipartResolver multipartResolver =
new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(maxUploadSize);
return multipartResolver;
}
/**
* handlerMapping .
* @return handlerMapping
*/
@Bean (name = "handlerMapping")
public RequestMappingHandlerMapping requestMappingHandlerMapping(
LocaleChangeInterceptor localeChangeInterceptor) {
RequestMappingHandlerMapping requestMappingHandlerMapping =
new RequestMappingHandlerMapping();
requestMappingHandlerMapping.setInterceptors(localeChangeInterceptor);
return requestMappingHandlerMapping;
}
/**
* jaxb2Marshaller .
* @return jaxb2Marshaller
*/
@Bean (name = "jaxb2Marshaller")
public Jaxb2Marshaller jaxb2Marshaller() {
Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
jaxb2Marshaller.setClassesToBeBound(org.maxkey.domain.xml.UserInfoXML.class);;
return jaxb2Marshaller;
}
/**
* marshallingHttpMessageConverter .
* @return marshallingHttpMessageConverter
*/
@Bean (name = "marshallingHttpMessageConverter")
public MarshallingHttpMessageConverter marshallingHttpMessageConverter(
Jaxb2Marshaller jaxb2Marshaller) {
MarshallingHttpMessageConverter marshallingHttpMessageConverter =
new MarshallingHttpMessageConverter();
marshallingHttpMessageConverter.setMarshaller(jaxb2Marshaller);
marshallingHttpMessageConverter.setUnmarshaller(jaxb2Marshaller);
ArrayList<MediaType> mediaTypesList = new ArrayList<MediaType>();
mediaTypesList.add(MediaType.APPLICATION_XML);
marshallingHttpMessageConverter.setSupportedMediaTypes(mediaTypesList);
return marshallingHttpMessageConverter;
}
/**
* mappingJacksonHttpMessageConverter .
* @return mappingJacksonHttpMessageConverter
*/
@Bean (name = "mappingJacksonHttpMessageConverter")
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter =
new MappingJackson2HttpMessageConverter();
ArrayList<MediaType> mediaTypesList = new ArrayList<MediaType>();
mediaTypesList.add(MediaType.APPLICATION_JSON);
mappingJacksonHttpMessageConverter.setSupportedMediaTypes(mediaTypesList);
return mappingJacksonHttpMessageConverter;
}
/**
* AnnotationMethodHandlerAdapter
* requestMappingHandlerAdapter .
* @return requestMappingHandlerAdapter
*/
@Bean (name = "requestMappingHandlerAdapter")
public RequestMappingHandlerAdapter requestMappingHandlerAdapter(
MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter,
MarshallingHttpMessageConverter marshallingHttpMessageConverter) {
RequestMappingHandlerAdapter requestMappingHandlerAdapter =
new RequestMappingHandlerAdapter();
List<HttpMessageConverter<?>> httpMessageConverterList =
new ArrayList<HttpMessageConverter<?>>();
httpMessageConverterList.add(mappingJacksonHttpMessageConverter);
httpMessageConverterList.add(marshallingHttpMessageConverter);
requestMappingHandlerAdapter.setMessageConverters(httpMessageConverterList);
return requestMappingHandlerAdapter;
}
/**
* restTemplate .
* @return restTemplate
*/
@Bean (name = "restTemplate")
public RestTemplate restTemplate(
MappingJackson2HttpMessageConverter mappingJacksonHttpMessageConverter,
MarshallingHttpMessageConverter marshallingHttpMessageConverter) {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> httpMessageConverterList =
new ArrayList<HttpMessageConverter<?>>();
httpMessageConverterList.add(mappingJacksonHttpMessageConverter);
httpMessageConverterList.add(marshallingHttpMessageConverter);
restTemplate.setMessageConverters(httpMessageConverterList);
return restTemplate;
}
}

View File

@@ -35,7 +35,7 @@ public class MailOtpAuthn extends AbstractOptAuthn {
email.setAuthenticator( email.setAuthenticator(
new DefaultAuthenticator(emailConfig.getUsername(), emailConfig.getPassword())); new DefaultAuthenticator(emailConfig.getUsername(), emailConfig.getPassword()));
email.setFrom(emailConfig.getSenderMail()); email.setFrom(emailConfig.getSender());
email.setSubject(subject); email.setSubject(subject);
email.setMsg( email.setMsg(
MessageFormat.format( MessageFormat.format(

View File

@@ -6,134 +6,140 @@ import redis.clients.jedis.JedisPoolConfig;
public class RedisConnectionFactory { public class RedisConnectionFactory {
public static class DEFAULT_CONFIG{ public static class DEFAULT_CONFIG {
/** /**
* Redis默认服务器IP * Redis默认服务器IP
*/ */
public static String DEFAULT_ADDRESS = "127.0.0.1"; public static String DEFAULT_ADDRESS = "127.0.0.1";
/** /**
* Redis默认端口号 * Redis默认端口号
*/ */
public static int DEFAULT_PORT = 6379; public static int DEFAULT_PORT = 6379;
/** /**
* 访问密码 * 访问密码
*/ */
public static String DEFAULT_AUTH = "admin"; public static String DEFAULT_AUTH = "admin";
/** /**
* 可用连接实例的最大数目默认值为8<br> * 可用连接实例的最大数目默认值为8<br>
*如果赋值为-1则表示不限制如果pool已经分配了maxActive个jedis实例则此时pool的状态为exhausted(耗尽)。 * 如果赋值为-1则表示不限制如果pool已经分配了maxActive个jedis实例则此时pool的状态为exhausted(耗尽)。
**/ **/
public static int DEFAULT_MAX_ACTIVE = 5000; public static int DEFAULT_MAX_ACTIVE = 5000;
/** /**
* 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例默认值也是8。 * 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例默认值也是8。
*/ */
public static int DEFAULT_MAX_IDLE = 5000; public static int DEFAULT_MAX_IDLE = 5000;
/** /**
* 等待可用连接的最大时间,单位毫秒,默认值为-1表示永不超时。如果超过等待时间则直接抛出JedisConnectionException * 等待可用连接的最大时间,单位毫秒,默认值为-1表示永不超时。如果超过等待时间则直接抛出JedisConnectionException
*/ */
public static int DEFAULT_MAX_WAIT_MILLIS = 10000; public static int DEFAULT_MAX_WAIT_MILLIS = 10000;
public static int DEFAULT_TIMEOUT = 10000; public static int DEFAULT_TIMEOUT = 10000;
/** /**
* 在borrow一个jedis实例时是否提前进行validate操作如果为true则得到的jedis实例均是可用的 * 在borrow一个jedis实例时是否提前进行validate操作如果为true则得到的jedis实例均是可用的
*/ */
public static boolean DEFAULT_TEST_ON_BORROW = true; public static boolean DEFAULT_TEST_ON_BORROW = true;
/** /**
* 默认过期时间 * 默认过期时间
*/ */
public static int DEFAULT_LIFETIME = 600; public static int DEFAULT_LIFETIME = 600;
} }
JedisPoolConfig poolConfig; JedisPoolConfig poolConfig;
private JedisPool jedisPool = null; private JedisPool jedisPool = null;
private String hostname; private String hostName;
private int port; private int port;
private String password; private String password;
private int timeOut; private int timeOut;
public RedisConnectionFactory() { public RedisConnectionFactory() {
} }
public void initConnectionFactory() { public void initConnectionFactory() {
if(jedisPool==null){ if (jedisPool == null) {
try { try {
if(this.hostname==null||hostname.equals("")){ if (this.hostName == null || hostName.equals("")) {
hostname= DEFAULT_CONFIG.DEFAULT_ADDRESS; hostName = DEFAULT_CONFIG.DEFAULT_ADDRESS;
} }
if(port==0){ if (port == 0) {
port= DEFAULT_CONFIG.DEFAULT_PORT; port = DEFAULT_CONFIG.DEFAULT_PORT;
} }
if(timeOut==0){ if (timeOut == 0) {
timeOut=DEFAULT_CONFIG.DEFAULT_TIMEOUT; timeOut = DEFAULT_CONFIG.DEFAULT_TIMEOUT;
} }
if(this.password==null||this.password.equals("")||this.password.equalsIgnoreCase("password")){ if (this.password == null || this.password.equals("") || this.password.equalsIgnoreCase("password")) {
this.password=null; this.password = null;
} }
jedisPool = new JedisPool(poolConfig, hostname, port, timeOut, password); jedisPool = new JedisPool(poolConfig, hostName, port, timeOut, password);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
} }
public synchronized RedisConnection getConnection(){ public synchronized RedisConnection getConnection() {
initConnectionFactory(); initConnectionFactory();
RedisConnection redisConnection=new RedisConnection(this); RedisConnection redisConnection = new RedisConnection(this);
return redisConnection; return redisConnection;
} }
public Jedis open(){ public Jedis open() {
return jedisPool.getResource(); return jedisPool.getResource();
} }
public void close(Jedis conn){ public void close(Jedis conn) {
//jedisPool.returnResource(conn); // jedisPool.returnResource(conn);
conn.close(); conn.close();
} }
public String getHostname() {
return hostname;
}
public void setHostname(String hostname) { public String getHostName() {
this.hostname = hostname; return hostName;
} }
public int getPort() { public void setHostName(String hostName) {
return port; this.hostName = hostName;
} }
public void setPort(int port) { public int getPort() {
this.port = port; return port;
} }
public String getPassword() { public void setPort(int port) {
return password; this.port = port;
} }
public void setPassword(String password) { public String getPassword() {
this.password = password; return password;
} }
public int getTimeOut() { public void setPassword(String password) {
return timeOut; this.password = password;
} }
public void setTimeOut(int timeOut) { public int getTimeOut() {
this.timeOut = timeOut; return timeOut;
} }
public void setTimeOut(int timeOut) {
this.timeOut = timeOut;
}
public void setPoolConfig(JedisPoolConfig poolConfig) {
this.poolConfig = poolConfig;
}
public JedisPoolConfig getPoolConfig() {
return poolConfig;
}
public void setPoolConfig(JedisPoolConfig poolConfig) {
this.poolConfig = poolConfig;
}
} }

View File

@@ -1,174 +0,0 @@
package org.maxkey.web;
import com.google.code.kaptcha.Producer;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.maxkey.config.ApplicationConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* ImageEndpoint Producer Image and captcha.
* @author Crystal.Sea
*
*/
@Controller
public class ImageEndpoint {
private static final Logger _logger = LoggerFactory.getLogger(ImageEndpoint.class);
@Autowired
private Producer captchaProducer;
@Autowired
@Qualifier("applicationConfig")
ApplicationConfig applicationConfig;
/**
* captcha image Producer.
*
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@RequestMapping(value = "/captcha")
public void captchaHandleRequest(HttpServletRequest request, HttpServletResponse response) {
try {
String kaptchaText = captchaProducer.createText();
if (applicationConfig.getLoginConfig().getCaptchaType()
.equalsIgnoreCase("Arithmetic")) {
Integer intParamA = Integer.valueOf(kaptchaText.substring(0, 1));
Integer intParamB = Integer.valueOf(kaptchaText.substring(1, 2));
Integer calculateValue = 0;
if ((intParamA > intParamB) && ((intParamA + intParamB) % 5 > 3)) {
calculateValue = intParamA - intParamB;
kaptchaText = intParamA + "-" + intParamB + "=?";
} else {
calculateValue = intParamA + intParamB;
kaptchaText = intParamA + "+" + intParamB + "=?";
}
_logger.trace("Sesssion id " + request.getSession().getId()
+ " , Arithmetic calculate Value is " + calculateValue);
request.getSession().setAttribute(
WebConstants.KAPTCHA_SESSION_KEY, calculateValue + "");
} else {
// store the text in the session
request.getSession().setAttribute(WebConstants.KAPTCHA_SESSION_KEY, kaptchaText);
}
_logger.trace("Sesssion id " + request.getSession().getId()
+ " , Captcha Text is " + kaptchaText);
// create the image with the text
BufferedImage bufferedImage = captchaProducer.createImage(kaptchaText);
producerImage(request,response,bufferedImage);
} catch (Exception e) {
_logger.error("captcha Producer Error " + e.getMessage());
}
}
/**
* Session Image Producer.
*
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@RequestMapping("/image/{id}")
public void imageHandleRequest(HttpServletRequest request, HttpServletResponse response,
@PathVariable("id") String id) {
try {
// get session image bytes
byte[] image = (byte[]) request.getSession().getAttribute(id);
producerImage(request,response,byte2BufferedImage(image));
} catch (Exception e) {
_logger.error("captcha Producer Error " + e.getMessage());
}
}
/**
* producerImage.
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param bufferedImage BufferedImage
* @throws IOException error
*/
public static void producerImage(HttpServletRequest request,
HttpServletResponse response,
BufferedImage bufferedImage) throws IOException {
// Set to expire far in the past.
response.setDateHeader("Expires", 0);
// Set standard HTTP/1.1 no-cache headers.
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// Set standard HTTP/1.0 no-cache header.
response.setHeader("Pragma", "no-cache");
// return a jpeg/gif
response.setContentType("image/gif");
// create the image
if (bufferedImage != null) {
ServletOutputStream out = response.getOutputStream();
// write the data out
ImageIO.write(bufferedImage, "gif", out);
try {
out.flush();
} finally {
out.close();
}
}
}
/**
* byte2BufferedImage.
* @param imageByte bytes
* @return
*/
public static BufferedImage byte2BufferedImage(byte[] imageByte) {
try {
InputStream in = new ByteArrayInputStream(imageByte);
BufferedImage bufferedImage = ImageIO.read(in);
return bufferedImage;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* bufferedImage2Byte.
* @param bufferedImage BufferedImage
* @return
*/
public static byte[] bufferedImage2Byte(BufferedImage bufferedImage) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "gif", byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void setCaptchaProducer(Producer captchaProducer) {
this.captchaProducer = captchaProducer;
}
public void setApplicationConfig(ApplicationConfig applicationConfig) {
this.applicationConfig = applicationConfig;
}
}

View File

@@ -0,0 +1,103 @@
package org.maxkey.web.image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.maxkey.config.ApplicationConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
/**
* AbstractImageEndpoint Producer Image .
* @author Crystal.Sea
*
*/
public class AbstractImageEndpoint {
private static final Logger _logger = LoggerFactory.getLogger(AbstractImageEndpoint.class);
@Autowired
@Qualifier("applicationConfig")
ApplicationConfig applicationConfig;
/**
* producerImage.
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param bufferedImage BufferedImage
* @throws IOException error
*/
public static void producerImage(HttpServletRequest request,
HttpServletResponse response,
BufferedImage bufferedImage) throws IOException {
// Set to expire far in the past.
response.setDateHeader("Expires", 0);
// Set standard HTTP/1.1 no-cache headers.
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
// Set IE extended HTTP/1.1 no-cache headers (use addHeader).
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
// Set standard HTTP/1.0 no-cache header.
response.setHeader("Pragma", "no-cache");
// return a jpeg/gif
response.setContentType("image/gif");
_logger.trace("create the image");
// create the image
if (bufferedImage != null) {
ServletOutputStream out = response.getOutputStream();
// write the data out
ImageIO.write(bufferedImage, "gif", out);
try {
out.flush();
} finally {
out.close();
}
}
}
/**
* byte2BufferedImage.
* @param imageByte bytes
* @return
*/
public static BufferedImage byte2BufferedImage(byte[] imageByte) {
try {
InputStream in = new ByteArrayInputStream(imageByte);
BufferedImage bufferedImage = ImageIO.read(in);
return bufferedImage;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* bufferedImage2Byte.
* @param bufferedImage BufferedImage
* @return
*/
public static byte[] bufferedImage2Byte(BufferedImage bufferedImage) {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, "gif", byteArrayOutputStream);
return byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void setApplicationConfig(ApplicationConfig applicationConfig) {
this.applicationConfig = applicationConfig;
}
}

View File

@@ -0,0 +1,76 @@
package org.maxkey.web.image;
import com.google.code.kaptcha.Producer;
import java.awt.image.BufferedImage;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.maxkey.web.WebConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* ImageCaptchaEndpoint Producer captcha.
* @author Crystal.Sea
*
*/
@Controller
public class ImageCaptchaEndpoint extends AbstractImageEndpoint {
private static final Logger _logger = LoggerFactory.getLogger(ImageCaptchaEndpoint.class);
@Autowired
private Producer captchaProducer;
/**
* captcha image Producer.
*
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@RequestMapping(value = "/captcha")
public void captchaHandleRequest(HttpServletRequest request, HttpServletResponse response) {
try {
String kaptchaText = captchaProducer.createText();
if (applicationConfig.getLoginConfig().getCaptchaType()
.equalsIgnoreCase("Arithmetic")) {
Integer intParamA = Integer.valueOf(kaptchaText.substring(0, 1));
Integer intParamB = Integer.valueOf(kaptchaText.substring(1, 2));
Integer calculateValue = 0;
if ((intParamA > intParamB) && ((intParamA + intParamB) % 5 > 3)) {
calculateValue = intParamA - intParamB;
kaptchaText = intParamA + "-" + intParamB + "=?";
} else {
calculateValue = intParamA + intParamB;
kaptchaText = intParamA + "+" + intParamB + "=?";
}
_logger.trace("Sesssion id " + request.getSession().getId()
+ " , Arithmetic calculate Value is " + calculateValue);
request.getSession().setAttribute(
WebConstants.KAPTCHA_SESSION_KEY, calculateValue + "");
} else {
// store the text in the session
request.getSession().setAttribute(WebConstants.KAPTCHA_SESSION_KEY, kaptchaText);
}
_logger.trace("Sesssion id " + request.getSession().getId()
+ " , Captcha Text is " + kaptchaText);
// create the image with the text
BufferedImage bufferedImage = captchaProducer.createImage(kaptchaText);
producerImage(request,response,bufferedImage);
} catch (Exception e) {
_logger.error("captcha Producer Error " + e.getMessage());
}
}
public void setCaptchaProducer(Producer captchaProducer) {
this.captchaProducer = captchaProducer;
}
}

View File

@@ -0,0 +1,40 @@
package org.maxkey.web.image;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* ImageEndpoint Producer Image and captcha.
* @author Crystal.Sea
*
*/
@Controller
public class ImageEndpoint extends AbstractImageEndpoint {
private static final Logger _logger = LoggerFactory.getLogger(ImageEndpoint.class);
/**
* Session Image Producer.
*
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@RequestMapping("/image/{id}")
public void imageHandleRequest(HttpServletRequest request, HttpServletResponse response,
@PathVariable("id") String id) {
try {
// get session image bytes
byte[] image = (byte[]) request.getSession().getAttribute(id);
producerImage(request,response,byte2BufferedImage(image));
} catch (Exception e) {
_logger.error("captcha Producer Error " + e.getMessage());
}
}
}

View File

@@ -1,34 +1,17 @@
package org.maxkey; package org.maxkey;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.Properties;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler;
import org.maxkey.crypto.password.PasswordReciprocal;
import org.maxkey.web.InitializeContext; import org.maxkey.web.InitializeContext;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.ImportResource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus;
import com.google.code.kaptcha.Producer;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
@SpringBootApplication @SpringBootApplication
@ImportResource(locations={"classpath:spring/maxkey-mgt.xml"}) @ImportResource(locations={"classpath:spring/maxkey-mgt.xml"})
@@ -64,56 +47,4 @@ public class MaxKeyMgtApplication extends SpringBootServletInitializer {
return application.sources(MaxKeyMgtApplication.class); return application.sources(MaxKeyMgtApplication.class);
} }
@Bean
MaxKeyMgtConfig MaxKeyMgtConfig() {
return new MaxKeyMgtConfig();
}
/**
* 配置默认错误页面仅用于内嵌tomcat启动时
* 使用这种方式在打包为war后不起作用
*
* @return
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST,"/exception/error/400");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND,"/exception/error/404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/exception/error/500");
factory.addErrorPages(errorPage400, errorPage404,errorPage500);
}
};
}
@Bean(name = "passwordReciprocal")
public PasswordReciprocal passwordReciprocal() {
return new PasswordReciprocal();
}
@Bean(name = "savedRequestSuccessHandler")
public SavedRequestAwareAuthenticationSuccessHandler SavedRequestAwareAuthenticationSuccessHandler() {
return new SavedRequestAwareAuthenticationSuccessHandler();
}
/**
* Captcha Producer Config .
* @return Producer
* @throws IOException
*/
@Bean(name = "captchaProducer")
public Producer captchaProducer() throws IOException{
Resource resource = new ClassPathResource("config/kaptcha.properties");
_logger.debug("Kaptcha config file " + resource.getURL());
DefaultKaptcha kaptcha=new DefaultKaptcha();
Properties properties = new Properties();
properties.load(resource.getInputStream());
Config config = new Config(properties);
kaptcha.setConfig(config);
return kaptcha;
}
} }

View File

@@ -1,15 +1,42 @@
package org.maxkey; package org.maxkey;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler;
import org.maxkey.crypto.password.PasswordReciprocal;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.http.HttpStatus;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
@Configuration @Configuration
@PropertySource("classpath:/application.properties") @PropertySource("classpath:/application.properties")
@MapperScan("org.maxkey.dao.persistence,")
public class MaxKeyMgtConfig { public class MaxKeyMgtConfig {
private static final Logger _logger = LoggerFactory.getLogger(MaxKeyMgtConfig.class); private static final Logger _logger = LoggerFactory.getLogger(MaxKeyMgtConfig.class);
@Autowired
@Qualifier("dataSource")
DataSource dataSource;
@Autowired
@Qualifier("sqlSessionFactory")
SqlSessionFactory sqlSessionFactory;
@Value("${server.port:8080}") @Value("${server.port:8080}")
private int port; private int port;
@@ -21,5 +48,58 @@ public class MaxKeyMgtConfig {
this.port = port; this.port = port;
} }
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "passwordReciprocal")
public PasswordReciprocal passwordReciprocal() {
return new PasswordReciprocal();
}
@Bean(name = "savedRequestSuccessHandler")
public SavedRequestAwareAuthenticationSuccessHandler SavedRequestAwareAuthenticationSuccessHandler() {
return new SavedRequestAwareAuthenticationSuccessHandler();
}
@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate() {
return new JdbcTemplate(dataSource);
}
/*
@Bean(name = "sqlSession")
public SqlSessionTemplate sqlSession() throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}*/
@Bean(name = "transactionManager")
DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource);
}
/**
* 配置默认错误页面仅用于内嵌tomcat启动时
* 使用这种方式在打包为war后不起作用
*
* @return
*/
@Bean
public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override
public void customize(ConfigurableWebServerFactory factory) {
_logger.debug("WebServerFactoryCustomizer ... ");
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST,"/exception/error/400");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND,"/exception/error/404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/exception/error/500");
factory.addErrorPages(errorPage400, errorPage404,errorPage500);
}
};
}
} }

View File

@@ -0,0 +1,5 @@
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.maxkey.MaxKeyMgtConfig,\
org.maxkey.config.KaptchaAutoConfiguration,\
org.maxkey.config.MvcAutoConfiguration

View File

@@ -1,14 +1,39 @@
#server config
#spring.profiles.active=dev #spring.profiles.active=dev
#application
application.title=MaxKey
application.name=MaxKey-Mgt
application.formatted-version=v1.5.0 GA
#server config
#server port #server port
server.port=9521 server.port=9521
#web app context path #web app context path
server.servlet.context-path=/maxkey-mgt server.servlet.context-path=/maxkey-mgt
spring.servlet.multipart.enabled=true
application.name=MaxKey-Mgt spring.servlet.multipart.max-file-size=4194304
application.formatted-version=v1.5.0 GA #server.servlet.encoding.charset.from=
#server.servlet.encoding.charset=
#for freemarker #server.servlet.encoding.enabled=
#server.servlet.encoding.force=
#datasource
spring.datasource.username=root
spring.datasource.password=maxkey
spring.datasource.url=jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#mybatis
mybatis.type-aliases-package=org.maxkey.domain,org.maxkey.domain.apps,
mybatis.mapper-locations=classpath*:/org/maxkey/dao/persistence/xml/mysql/*.xml
#mail
spring.mail.default-encoding=utf-8
spring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=maxkey@163.com
spring.mail.password=password
spring.mail.protocol=smtp
spring.mail.properties.ssl=true
spring.mail.properties.sender=maxkey@163.com
#freemarker
spring.freemarker.template-loader-path=classpath:/templates/views spring.freemarker.template-loader-path=classpath:/templates/views
spring.freemarker.cache=false spring.freemarker.cache=false
spring.freemarker.charset=UTF-8 spring.freemarker.charset=UTF-8

View File

@@ -10,75 +10,21 @@ config.server.prefix.uri=${config.server.name}:9521/maxkey-mgt
config.server.default.uri=${config.server.prefix.uri}/main config.server.default.uri=${config.server.prefix.uri}/main
config.maxkey.uri=${config.server.name}/maxkey config.maxkey.uri=${config.server.name}/maxkey
############################################################################ ############################################################################
# Application Configuration
############################################################################
# DataBase configuration
# JDBC Driver
# for MySql com.mysql.jdbc.Driver
# for oracle oracle.jdbc.driver.OracleDriver
# for DB2 com.ibm.db2.jdbc.app.DB2Driver
# for SqlServer com.microsoft.jdbc.sqlserver.SQLServerDriver
# for SyBase com.sybase.jdbc.SybDriver
# for PostgreSQL org.postgresql.Driver
# for Derby org.apache.derby.jdbc.ClientDriver
config.datasource.driverclass=com.mysql.jdbc.Driver
# JDBC URL
# you need database hostname,port,databasename
# for MySql jdbc:mysql://hostname:port/secdb
# for oracle jdbc:oracle:thin:@hostname:port:secdb
# for DB2 jdbc:db2://hostname:port/secdb
# for SqlServer jdbc:microsoft:sqlserver://hostname:port;DatabaseName=secdb
# for SyBase jdbc:sybase:Tds:hostname:port/secdb
# for Derby jdbc:derby://localhost:1527/secdb
#
config.datasource.url=jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8
config.datasource.username=root
#root/maxkey
config.datasource.password=maxkey
#db2,derby,mysql,oracle,postgresql,sqlserver at Dialect
config.datasource.database=mysql
config.datasource.password.encrypt=false
# End DataBase configuration
############################################################################
# CharacterEncoding
#CharacterEncoding true/false
config.characterencoding.encoding=true
config.characterencoding.fromcharset=iso8859-1
config.characterencoding.tocharset=UTF-8
# End CharacterEncoding
############################################################################
############################################################################
# Login
config.login.captcha=false
#text or arithmetic
config.login.captcha.type=text
config.login.socialAuth=true
config.login.msad.kerberos=false
# End Login
############################################################################
# EMAIL configuration
config.email.username=test@maxkey.org
config.email.password=3&8Ujbnm5hkjhFD
config.email.smtpHost=smtp.exmail.qq.com
config.email.port=25
config.email.senderMail=test@maxkey.org
config.email.ssl=false
############################################################################
# Login configuration # Login configuration
#enable captcha #enable captcha
config.login.captcha=true config.login.captcha=true
#text or arithmetic
config.login.captcha.type=text
#enable two factor,use one time password #enable two factor,use one time password
config.login.onetimepwd=true config.login.onetimepwd=false
#enable social sign on #enable social sign on
config.login.socialsignon=true config.login.socialsignon=false
#Enable kerberos/SPNEGO #Enable kerberos/SPNEGO
config.login.kerberos=true config.login.kerberos=false
#wsFederation #wsFederation
config.login.wsfederation=false config.login.wsfederation=false
#remeberme #remeberme
config.login.remeberme=true config.login.remeberme=false
#validity #validity
config.login.remeberme.validity= config.login.remeberme.validity=
#default.uri #default.uri

View File

@@ -1,90 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- dataSource define begin -->
<!-- dataSource configuration -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" >
<!-- <property name="driverClass" value="#{dataSoruceConfig.driverClass}"/> -->
<property name="url" value="#{dataSoruceConfig.url}"/>
<property name="username" value="#{dataSoruceConfig.username}"/>
<property name="password" value="#{dataSoruceConfig.password}"/>
</bean>
<!-- JNDI data source configuration -->
<!-- jndiName is jndi name -->
<!-- if you don,t want use prefix 'java:comp/env/' set resourceRef to true,default is false -->
<!--
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jndi_maxkey_db" />
<property name="resourceRef" value="true" />
</bean> -->
<!-- dataSource define end -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Declare a transaction manager -->
<!-- transaction manager, use JtaTransactionManager for global tx-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Enable annotation style of managing transactions
<tx:annotation-driven transaction-manager="transactionManager" />-->
<!-- enable component scanning (beware that this does not enable mapper scanning!) -->
<context:component-scan base-package="org.maxkey.dao.service" />
<!-- enable autowire -->
<context:annotation-config />
<!-- enable transaction demarcation with annotations
<tx:annotation-driven />-->
<!--<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">-->
<bean id="sqlSessionFactory" class="org.apache.mybatis.jpa.MyBatisSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="dialect" value="mysql" />
<property name="timeout" value="30" />
<property name="transactionFactory">
<bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
</property>
<property name="typeAliasesPackage"
value="
org.maxkey.domain,
org.maxkey.domain.apps,
" />
<property name="mapperLocations" value="classpath*:org/maxkey/dao/persistence/xml/#{dataSoruceConfig.database}/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="
org.maxkey.dao.persistence,
" />
</bean>
</beans>

View File

@@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- enable autowire -->
<context:annotation-config />
<!-- language select must remove -->
<mvc:annotation-driven />
<!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
@Controller and @Service. Make sure to set the correct base-package-->
<!-- domain bean -->
<context:component-scan base-package="org.maxkey.domain" />
<context:component-scan base-package="org.maxkey.domain.apps" />
<context:component-scan base-package="org.maxkey.domain.userinfo" />
<!-- Business Contorller -->
<context:component-scan base-package="org.maxkey.web.endpoint" />
<context:component-scan base-package="org.maxkey.web.contorller" />
<context:component-scan base-package="org.maxkey.web.apps.contorller" />
<context:component-scan base-package="org.maxkey.web.endpoint" />
<context:component-scan base-package="org.maxkey.authn" />
<context:component-scan base-package="org.maxkey.dao" />
<context:component-scan base-package="org.maxkey.web" />
<context:component-scan base-package="org.maxkey.web.tag" />
<!-- LocaleResolver -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieDomain" value="#{applicationConfig.subDomainName}"/>
<property name="cookieName" value="single_sign_on_lang"/>
<property name="cookieMaxAge" value="604800" />
<!-- auto select language by brower remove -->
<!--<property name="defaultLocale" value="en" /> -->
</bean>
<!-- 消息处理可以直接使用properties的key值返回的是对应的value值 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:messages/message</value>
</list>
</property>
<!-- 必须设置成false否则hibernate原有的校验信息无法返回value值-->
<property name="useCodeAsDefaultMessage" value="false"/>
</bean>
<!-- Locale Change Interceptor and Resolver definition -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
<!-- XML bean Marshaller define -->
<bean id="Jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>org.maxkey.domain.xml.UserInfoXML</value>
</list>
</property>
</bean>
<!-- MarshallingHttpMessageConverter -->
<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="Jaxb2Marshaller" />
<property name="unmarshaller" ref="Jaxb2Marshaller" />
<property name="supportedMediaTypes">
<list>
<value>application/xml;charset=UTF-8</value>
</list>
</property>
</bean>
<!--MappingJacksonHttpMessageConverter -->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- REST Client -->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<ref bean="marshallingHttpMessageConverter" />
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<!-- AnnotationMethodHandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<util:list id="beanList">
<ref bean="marshallingHttpMessageConverter" />
<ref bean="mappingJacksonHttpMessageConverter" />
</util:list>
</property>
</bean>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
</bean>
<!-- upload file support -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="4194304" />
</bean>
</beans>

View File

@@ -34,6 +34,25 @@
</bean> </bean>
<context:component-scan base-package="org.maxkey.config" /> <context:component-scan base-package="org.maxkey.config" />
<!-- Scans the classpath for annotated components that will be auto-registered as Spring beans.
@Controller and @Service. Make sure to set the correct base-package-->
<!-- domain bean -->
<context:component-scan base-package="org.maxkey.domain" />
<context:component-scan base-package="org.maxkey.domain.apps" />
<context:component-scan base-package="org.maxkey.domain.userinfo" />
<!-- Business Contorller -->
<context:component-scan base-package="org.maxkey.web.endpoint" />
<context:component-scan base-package="org.maxkey.web.contorller" />
<context:component-scan base-package="org.maxkey.web.apps.contorller" />
<context:component-scan base-package="org.maxkey.web.endpoint" />
<context:component-scan base-package="org.maxkey.authn" />
<context:component-scan base-package="org.maxkey.dao" />
<context:component-scan base-package="org.maxkey.web" />
<context:component-scan base-package="org.maxkey.web.tag" />
<bean id="keyStoreLoader" class="org.maxkey.crypto.keystore.KeyStoreLoader"> <bean id="keyStoreLoader" class="org.maxkey.crypto.keystore.KeyStoreLoader">
<property name="entityName" value="${config.saml.v20.idp.issuing.entity.id}" /> <property name="entityName" value="${config.saml.v20.idp.issuing.entity.id}" />
@@ -61,10 +80,6 @@
<property name="passwordEncoder" ref="passwordReciprocal"></property> <property name="passwordEncoder" ref="passwordReciprocal"></property>
</bean> </bean>
<import resource="maxkey-mgt-persistence.xml"/>
<import resource="maxkey-mgt-web.xml"/>
<import resource="maxkey-mgt-security.xml"/> <import resource="maxkey-mgt-security.xml"/>
<import resource="maxkey-mgt-task.xml"/> <import resource="maxkey-mgt-task.xml"/>

View File

@@ -1,18 +1,23 @@
package org.maxkey; package org.maxkey;
import java.io.IOException; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import java.util.Properties; import javax.sql.DataSource;
import org.apache.catalina.Context; import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector; import org.apache.catalina.connector.Connector;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.maxkey.authz.oauth2.provider.endpoint.TokenEndpointAuthenticationFilter; import org.maxkey.authz.oauth2.provider.endpoint.TokenEndpointAuthenticationFilter;
import org.maxkey.authn.RealmAuthenticationProvider;
import org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler; import org.maxkey.authn.SavedRequestAwareAuthenticationSuccessHandler;
import org.maxkey.crypto.password.PasswordReciprocal; import org.maxkey.crypto.password.PasswordReciprocal;
import org.maxkey.crypto.password.opt.algorithm.KeyUriFormat;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.ErrorPage; import org.springframework.boot.web.server.ErrorPage;
@@ -21,20 +26,20 @@ import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource; import org.springframework.context.annotation.ImportResource;
import org.springframework.context.annotation.Primary;
import org.springframework.context.annotation.PropertySource; import org.springframework.context.annotation.PropertySource;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.jdbc.core.JdbcTemplate;
import com.google.code.kaptcha.Producer; import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
@Configuration @Configuration
@ImportResource(locations = { "classpath:spring/maxkey.xml" }) @ImportResource(locations = { "classpath:spring/maxkey.xml" })
@PropertySource("classpath:/application.properties") @PropertySource("classpath:/application.properties")
@PropertySource("classpath:/config/applicationConfig.properties")
@MapperScan("org.maxkey.dao.persistence,")
public class MaxKeyConfig { public class MaxKeyConfig {
private static final Logger _logger = LoggerFactory.getLogger(MaxKeyConfig.class); private static final Logger _logger = LoggerFactory.getLogger(MaxKeyConfig.class);
@Value("${server.port:8080}") @Value("${server.port:8080}")
private int port; private int port;
@@ -42,8 +47,11 @@ public class MaxKeyConfig {
return port; return port;
} }
public void setPort(int port) { @Bean
this.port = port; @Primary
@ConfigurationProperties("spring.datasource")
public DataSource dataSource() {
return DruidDataSourceBuilder.create().build();
} }
@Bean @Bean
@@ -66,6 +74,7 @@ public class MaxKeyConfig {
return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() { return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {
@Override @Override
public void customize(ConfigurableWebServerFactory factory) { public void customize(ConfigurableWebServerFactory factory) {
_logger.debug("WebServerFactoryCustomizer ... ");
ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/exception/error/400"); ErrorPage errorPage400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/exception/error/400");
ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/exception/error/404"); ErrorPage errorPage404 = new ErrorPage(HttpStatus.NOT_FOUND, "/exception/error/404");
ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/exception/error/500"); ErrorPage errorPage500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/exception/error/500");
@@ -111,21 +120,52 @@ public class MaxKeyConfig {
return new SavedRequestAwareAuthenticationSuccessHandler(); return new SavedRequestAwareAuthenticationSuccessHandler();
} }
/**
* Captcha Producer Config . @Value("${config.otp.keyuri.format.type:totp}")
* @return Producer String keyuriFormatType;
* @throws IOException
*/ @Value("${config.otp.keyuri.format.domain:MaxKey.top}")
@Bean(name = "captchaProducer") String keyuriFormatDomain;
public Producer captchaProducer() throws IOException{
Resource resource = new ClassPathResource("config/kaptcha.properties"); @Value("${config.otp.keyuri.format.issuer:MaxKey}")
_logger.debug("Kaptcha config file " + resource.getURL()); String keyuriFormatIssuer;
DefaultKaptcha kaptcha=new DefaultKaptcha();
Properties properties = new Properties(); @Value("${config.otp.keyuri.format.digits:6}")
properties.load(resource.getInputStream()); int keyuriFormatDigits;
Config config = new Config(properties);
kaptcha.setConfig(config); @Value("${config.otp.keyuri.format.period:30}")
return kaptcha; int keyuriFormatPeriod;
@Bean(name = "keyUriFormat")
public KeyUriFormat keyUriFormat() {
KeyUriFormat keyUriFormat=new KeyUriFormat();
keyUriFormat.setType(keyuriFormatType);
keyUriFormat.setDomain(keyuriFormatDomain);
keyUriFormat.setIssuer(keyuriFormatIssuer);
keyUriFormat.setDigits(keyuriFormatDigits);
keyUriFormat.setPeriod(keyuriFormatPeriod);
_logger.debug("KeyUri Format " + keyUriFormat);
return keyUriFormat;
}
@Bean(name = "authenticationProvider")
public RealmAuthenticationProvider authenticationProvider() {
return new RealmAuthenticationProvider();
}
@Bean(name = "jdbcTemplate")
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "sqlSession")
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean(name = "transactionManager")
DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} }
} }

View File

@@ -0,0 +1,50 @@
package org.maxkey;
import org.maxkey.persistence.redis.RedisConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
@PropertySource("classpath:/application.properties")
public class RedisAutoConfiguration {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.lettuce.pool.max-active}")
private int maxActive;
@Value("${spring.redis.jedis.pool.max-wait}")
private int maxWait;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.lettuce.pool.min-idle}")
private int minIdle;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisConnectionFactory factory = new RedisConnectionFactory();
factory.setHostName(host);
factory.setPort(port);
factory.setTimeOut(timeout);
factory.setPassword(password);
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(maxIdle);
poolConfig.setMinIdle(minIdle);
poolConfig.setMaxTotal(maxActive);
poolConfig.setMaxWaitMillis(maxWait);
factory.setPoolConfig(poolConfig);
return factory;
}
}

View File

@@ -10,8 +10,8 @@ import org.maxkey.crypto.password.opt.algorithm.OtpSecret;
import org.maxkey.dao.service.UserInfoService; import org.maxkey.dao.service.UserInfoService;
import org.maxkey.domain.UserInfo; import org.maxkey.domain.UserInfo;
import org.maxkey.util.RQCodeUtils; import org.maxkey.util.RQCodeUtils;
import org.maxkey.web.ImageEndpoint;
import org.maxkey.web.WebContext; import org.maxkey.web.WebContext;
import org.maxkey.web.image.ImageEndpoint;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -80,7 +80,7 @@ public class RegistrationController {
email.setAuthenticator(new DefaultAuthenticator(applicationConfig.getEmailConfig().getUsername(), applicationConfig.getEmailConfig().getPassword())); email.setAuthenticator(new DefaultAuthenticator(applicationConfig.getEmailConfig().getUsername(), applicationConfig.getEmailConfig().getPassword()));
email.addTo(registration.getWorkEmail(), registration.getLastName()+registration.getFirstName()); email.addTo(registration.getWorkEmail(), registration.getLastName()+registration.getFirstName());
email.setFrom(applicationConfig.getEmailConfig().getSenderMail(), "ConnSec"); email.setFrom(applicationConfig.getEmailConfig().getSender(), "ConnSec");
email.setSubject("ConnSec Cloud Identity & Access Registration activate Email ."); email.setSubject("ConnSec Cloud Identity & Access Registration activate Email .");
String activateUrl=WebContext.getHttpContextPath()+"/registration/forward/activate/"+registration.getId(); String activateUrl=WebContext.getHttpContextPath()+"/registration/forward/activate/"+registration.getId();

View File

@@ -0,0 +1,5 @@
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.maxkey.RedisAutoConfiguration,\
org.maxkey.config.KaptchaAutoConfiguration,\
org.maxkey.config.MvcAutoConfiguration

View File

@@ -1,3 +1,8 @@
#spring.profiles.active=dev
#application
application.title=MaxKey
application.name=MaxKey
application.formatted-version=v1.5.0 GA
#server config #server config
#spring.profiles.active=dev #spring.profiles.active=dev
#server port #server port
@@ -9,13 +14,41 @@ server.ssl.key-alias=maxkey
server.ssl.enabled=true server.ssl.enabled=true
server.ssl.key-store-password=maxkey server.ssl.key-store-password=maxkey
server.ssl.key-store-type=JKS server.ssl.key-store-type=JKS
#web app context path #web app context path
server.servlet.context-path=/maxkey server.servlet.context-path=/maxkey
spring.servlet.multipart.enabled=true
application.name=MaxKey spring.servlet.multipart.max-file-size=4194304
application.formatted-version=v1.5.0 GA #encoding
#server.servlet.encoding.charset=UTF-8
#server.servlet.encoding.enabled=true
#server.servlet.encoding.force=true
#datasource
spring.datasource.username=root
spring.datasource.password=maxkey
spring.datasource.url=jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#mybatis
mybatis.type-aliases-package=org.maxkey.domain,org.maxkey.domain.apps,
mybatis.mapper-locations=classpath*:/org/maxkey/dao/persistence/xml/mysql/*.xml
#redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=password
spring.redis.timeout=10000
spring.redis.jedis.pool.max-wait=1000
spring.redis.jedis.pool.max-idle=200
spring.redis.lettuce.pool.max-active=-1
spring.redis.lettuce.pool.min-idle=0
#mail
spring.mail.default-encoding=utf-8
spring.mail.host=smtp.163.com
spring.mail.port=465
spring.mail.username=maxkey@163.com
spring.mail.password=password
spring.mail.protocol=smtp
spring.mail.properties.ssl=true
spring.mail.properties.sender=maxkey@163.com
#for freemarker #for freemarker
spring.freemarker.template-loader-path=classpath:/templates/views spring.freemarker.template-loader-path=classpath:/templates/views
spring.freemarker.cache=false spring.freemarker.cache=false
@@ -26,8 +59,9 @@ spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false spring.freemarker.expose-session-attributes=false
spring.freemarker.request-context-attribute=request spring.freemarker.request-context-attribute=request
spring.freemarker.suffix=.ftl spring.freemarker.suffix=.ftl
#static resources #static resources
spring.mvc.static-path-pattern=/static/** spring.mvc.static-path-pattern=/static/**
spring.messages.basename=classpath:messages/message
spring.messages.encoding=UTF-8
#main
spring.main.allow-bean-definition-overriding=true spring.main.allow-bean-definition-overriding=true

View File

@@ -8,74 +8,10 @@ config.server.name=http://${config.server.domain.sub}
config.server.prefix.uri=${config.server.name}/maxkey config.server.prefix.uri=${config.server.name}/maxkey
#default.uri #default.uri
config.server.default.uri=${config.server.prefix.uri}/maxkey/appList config.server.default.uri=${config.server.prefix.uri}/maxkey/appList
config.server.manage.uri=${config.server.name}:9521/maxkey-mgt/login config.server.management.uri=${config.server.name}:9521/maxkey-mgt/login
############################################################################
# DataBase configuration
############################################################################
#db2,derby,mysql,oracle,postgresql,sqlserver at com.connsec.db.mybatis.dialect.Dialect
config.datasource.database=mysql
# JDBC Driver
# for MySql com.mysql.jdbc.Driver
# for oracle oracle.jdbc.driver.OracleDriver
# for DB2 com.ibm.db2.jdbc.app.DB2Driver
# for SqlServer com.microsoft.jdbc.sqlserver.SQLServerDriver
# for SyBase com.sybase.jdbc.SybDriver
# for PostgreSQL org.postgresql.Driver
# for Derby org.apache.derby.jdbc.ClientDriver
config.datasource.driverclass=com.mysql.jdbc.Driver
# JDBC URL
# you need database hostname,port,databasename
# for MySql jdbc:mysql://hostname:port/secdb
# for oracle jdbc:oracle:thin:@hostname:port:secdb
# for DB2 jdbc:db2://hostname:port/secdb
# for SqlServer jdbc:microsoft:sqlserver://hostname:port;DatabaseName=secdb
# for SyBase jdbc:sybase:Tds:hostname:port/secdb
# for Derby jdbc:derby://localhost:1527/secdb
#
config.datasource.url=jdbc:mysql://localhost/maxkey?autoReconnect=true&characterEncoding=UTF-8
config.datasource.username=root
config.datasource.password=maxkey
config.datasource.password.encrypt=false
############################################################################
# EMAIL configuration
############################################################################
config.email.username=maxkey@163.com
config.email.password=password
config.email.smtpHost=smtp.163.com
config.email.port=465
config.email.senderMail=maxkey@163.com
config.email.ssl=true
############################################################################
# CharacterEncoding configuration
############################################################################
# CharacterEncoding true/false
config.characterencoding.encoding=true
config.characterencoding.charset.from=iso8859-1
config.characterencoding.charset.to=UTF-8
config.app.issuer=CN=ConSec,CN=COM,CN=SH config.app.issuer=CN=ConSec,CN=COM,CN=SH
############################################################################ ############################################################################
#IP
config.redis.hostname=127.0.0.1
#port
config.redis.port=6379
#password
config.redis.password=password
#
config.redis.timeout=10000
#
config.redis.pool.maxtotal=1000
#
config.redis.pool.maxidle=200
#
config.redis.pool.maxwaitmillis=1000
#
config.redis.pool.testonborrow=true
############################################################################
# Login configuration # Login configuration
#enable captcha #enable captcha
config.login.captcha=true config.login.captcha=true
@@ -98,6 +34,13 @@ config.login.remeberme.validity=
config.login.default.uri=appList config.login.default.uri=appList
config.ipaddress.whitelist=false config.ipaddress.whitelist=false
config.otp.keyuri.format.type=totp
config.otp.keyuri.format.digits=6
config.otp.keyuri.format.issuer=MaxKey
config.otp.keyuri.format.domain=${config.server.domain}
config.otp.keyuri.format.period=30
############################################################################ ############################################################################
# Kerberos Login configuration # Kerberos Login configuration
############################################################################ ############################################################################

View File

@@ -1,103 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- dataSource define begin -->
<!-- dataSource configuration -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" >
<!-- <property name="driverClass" value="#{dataSoruceConfig.driverClass}"/> -->
<property name="url" value="#{dataSoruceConfig.url}"/>
<property name="username" value="#{dataSoruceConfig.username}"/>
<property name="password" value="#{dataSoruceConfig.password}"/>
</bean>
<!-- JNDI data source configuration -->
<!-- jndiName is jndi name -->
<!-- if you don,t want use prefix 'java:comp/env/' set resourceRef to true,default is false -->
<!--
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jndi_maxkey_db" />
<property name="resourceRef" value="true" />
</bean> -->
<!-- dataSource define end -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Declare a transaction manager -->
<!-- transaction manager, use JtaTransactionManager for global tx-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- Enable annotation style of managing transactions
<tx:annotation-driven transaction-manager="transactionManager" />-->
<!-- enable component scanning (beware that this does not enable mapper scanning!) -->
<context:component-scan base-package="org.maxkey.dao.service" />
<!-- enable autowire -->
<context:annotation-config />
<!-- enable transaction demarcation with annotations
<tx:annotation-driven />-->
<!--<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">-->
<bean id="sqlSessionFactory" class="org.apache.mybatis.jpa.MyBatisSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="dialect" value="mysql" />
<property name="timeout" value="30" />
<property name="transactionFactory">
<bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
</property>
<property name="typeAliasesPackage"
value="
org.maxkey.domain,
org.maxkey.domain.apps,
" />
<property name="mapperLocations" value="classpath*:/org/maxkey/dao/persistence/xml/#{dataSoruceConfig.database}/*.xml" />
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<!-- scan for mappers and let them be autowired -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage"
value="
org.maxkey.dao.persistence,
" />
</bean>
<bean id="redisConnectionFactory" class="org.maxkey.persistence.redis.RedisConnectionFactory">
<property name="hostname" value="${config.redis.hostname}"/>
<property name="port" value="${config.redis.port}"/>
<property name="timeOut" value="${config.redis.timeout}"/>
<property name="poolConfig" >
<bean class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${config.redis.pool.maxtotal}" />
<property name="maxIdle" value="${config.redis.pool.maxidle}" />
<property name="maxWaitMillis" value="${config.redis.pool.maxwaitmillis}" />
<property name="testOnBorrow" value="${config.redis.pool.testonborrow}" />
</bean>
</property>
</bean>
</beans>

View File

@@ -75,15 +75,11 @@
<bean id="remeberMeService" class="org.maxkey.authn.support.rememberme.InMemoryRemeberMeService"> <bean id="remeberMeService" class="org.maxkey.authn.support.rememberme.InMemoryRemeberMeService">
</bean> </bean>
<!--
<bean id="keyUriFormat" class="org.maxkey.crypto.password.opt.algorithm.KeyUriFormat"> <bean id="remeberMeService" class="org.maxkey.authn.support.rememberme.RedisRemeberMeService">
<property name="type" value="totp" /> <property name="connectionFactory" ref="redisConnectionFactory"></property>
<property name="digits" value="6" /> </bean>
<property name="issuer" value="MaxKey" /> -->
<property name="domain" value="MaxKey.org" />
<property name="period" value="30" />
</bean>
<bean id="tfaOptAuthn" class="org.maxkey.crypto.password.opt.impl.TimeBasedOtpAuthn"> <bean id="tfaOptAuthn" class="org.maxkey.crypto.password.opt.impl.TimeBasedOtpAuthn">
</bean> </bean>
<!-- <!--
@@ -98,7 +94,6 @@
<bean id="tfaMobileOptAuthn" class="org.maxkey.crypto.password.opt.impl.sms.SmsOtpAuthnYunxin"> <bean id="tfaMobileOptAuthn" class="org.maxkey.crypto.password.opt.impl.sms.SmsOtpAuthnYunxin">
</bean> </bean>
<!-- Authentication Password Encoder Config --> <!-- Authentication Password Encoder Config -->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean> <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"></bean>
@@ -147,11 +142,6 @@
<constructor-arg ref="jdbcTemplate"/> <constructor-arg ref="jdbcTemplate"/>
</bean> </bean>
<!-- Authentication providers -->
<bean id="authenticationProvider" class="org.maxkey.authn.RealmAuthenticationProvider" >
</bean>
<mvc:annotation-driven /> <mvc:annotation-driven />
<mvc:default-servlet-handler /> <mvc:default-servlet-handler />

View File

@@ -1,108 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- LocaleResolver -->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
<property name="cookieDomain" value="#{applicationConfig.subDomainName}"/>
<property name="cookieName" value="maxkey_lang"/>
<property name="cookieMaxAge" value="604800" />
<!-- auto select language by brower remove -->
<!--<property name="defaultLocale" value="en" /> -->
</bean>
<!-- 消息处理可以直接使用properties的key值返回的是对应的value值 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:messages/message</value>
</list>
</property>
<!-- 必须设置成false否则hibernate原有的校验信息无法返回value值-->
<property name="useCodeAsDefaultMessage" value="false"/>
</bean>
<!-- Locale Change Interceptor and Resolver definition -->
<bean id="localeChangeInterceptor" class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
<!-- XML bean Marshaller define -->
<bean id="Jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>org.maxkey.domain.xml.UserInfoXML</value>
</list>
</property>
</bean>
<!-- MarshallingHttpMessageConverter -->
<bean id="marshallingHttpMessageConverter" class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="Jaxb2Marshaller" />
<property name="unmarshaller" ref="Jaxb2Marshaller" />
<property name="supportedMediaTypes">
<list>
<value>application/xml;charset=UTF-8</value>
</list>
</property>
</bean>
<!--MappingJacksonHttpMessageConverter -->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- REST Client -->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<ref bean="marshallingHttpMessageConverter" />
<ref bean="mappingJacksonHttpMessageConverter" />
</list>
</property>
</bean>
<!-- AnnotationMethodHandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<util:list id="beanList">
<ref bean="marshallingHttpMessageConverter" />
<ref bean="mappingJacksonHttpMessageConverter" />
</util:list>
</property>
</bean>
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="interceptors">
<list>
<ref bean="localeChangeInterceptor" />
</list>
</property>
</bean>
<!-- upload file support -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="4194304" />
</bean>
</beans>

View File

@@ -43,8 +43,6 @@
<context:component-scan base-package="org.maxkey.web.endpoint" /> <context:component-scan base-package="org.maxkey.web.endpoint" />
<context:component-scan base-package="org.maxkey.web.contorller" /> <context:component-scan base-package="org.maxkey.web.contorller" />
<!-- persistence configuration -->
<import resource="maxkey-persistence.xml"/>
<!-- authn support --> <!-- authn support -->
<import resource="maxkey-support.xml"/> <import resource="maxkey-support.xml"/>
<!-- single sign on protocol --> <!-- single sign on protocol -->
@@ -53,7 +51,5 @@
<import resource="maxkey-task.xml"/> <import resource="maxkey-task.xml"/>
<!-- Basic Authn for user login --> <!-- Basic Authn for user login -->
<import resource="maxkey-security.xml"/> <import resource="maxkey-security.xml"/>
<!-- web mvc configuration -->
<import resource="maxkey-web.xml"/>
</beans> </beans>