v 1.5.0 RC2
v 1.5.0 RC2
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -41,4 +41,9 @@ public class RedisRemeberMeService extends AbstractRemeberMeService {
|
|||||||
conn.close();
|
conn.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setConnectionFactory(RedisConnectionFactory connectionFactory) {
|
||||||
|
this.connectionFactory = connectionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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
|
|
||||||
+ "]";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
BIN
maxkey-lib/mybatis-jpa-extra-spring-boot-starter-2.0.jar
Normal file
BIN
maxkey-lib/mybatis-jpa-extra-spring-boot-starter-2.0.jar
Normal file
Binary file not shown.
@@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Auto Configure
|
||||||
|
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||||
|
org.maxkey.MaxKeyMgtConfig,\
|
||||||
|
org.maxkey.config.KaptchaAutoConfiguration,\
|
||||||
|
org.maxkey.config.MvcAutoConfiguration
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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>
|
|
||||||
@@ -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"/>
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
# Auto Configure
|
||||||
|
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
|
||||||
|
org.maxkey.RedisAutoConfiguration,\
|
||||||
|
org.maxkey.config.KaptchaAutoConfiguration,\
|
||||||
|
org.maxkey.config.MvcAutoConfiguration
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
############################################################################
|
############################################################################
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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>
|
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user