Skip to content

Commit 8500f74

Browse files
author
Weasley
committed
first commit
0 parents  commit 8500f74

30 files changed

+1535
-0
lines changed

.gitignore

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
HELP.md
2+
target/
3+
!.mvn/wrapper/maven-wrapper.jar
4+
!**/src/main/**/target/
5+
!**/src/test/**/target/
6+
7+
### STS ###
8+
.apt_generated
9+
.classpath
10+
.factorypath
11+
.project
12+
.settings
13+
.springBeans
14+
.sts4-cache
15+
16+
### IntelliJ IDEA ###
17+
.idea
18+
*.iws
19+
*.iml
20+
*.ipr
21+
22+
### NetBeans ###
23+
/nbproject/private/
24+
/nbbuild/
25+
/dist/
26+
/nbdist/
27+
/.nb-gradle/
28+
build/
29+
!**/src/main/**/build/
30+
!**/src/test/**/build/
31+
32+
### VS Code ###
33+
.vscode/
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.7.6</version>
9+
<relativePath/>
10+
</parent>
11+
12+
<groupId>io.github.weasley-j</groupId>
13+
<artifactId>mybatis-encrypt-spring-boot-starter</artifactId>
14+
<version>1.0.0</version>
15+
<name>mybatis-encrypt-spring-boot-starter</name>
16+
<description>A spring-boot starter to encrypt and decrypt some column of database. Based on MyBatis framework.</description>
17+
18+
<properties>
19+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
20+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
21+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
22+
<mybatis.version>3.5.11</mybatis.version>
23+
</properties>
24+
25+
<dependencies>
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.springframework.boot</groupId>
32+
<artifactId>spring-boot-autoconfigure-processor</artifactId>
33+
<optional>true</optional>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.springframework.boot</groupId>
37+
<artifactId>spring-boot-configuration-processor</artifactId>
38+
<optional>true</optional>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.projectlombok</groupId>
42+
<artifactId>lombok</artifactId>
43+
<optional>true</optional>
44+
</dependency>
45+
<dependency>
46+
<groupId>commons-codec</groupId>
47+
<artifactId>commons-codec</artifactId>
48+
</dependency>
49+
<dependency>
50+
<groupId>org.apache.commons</groupId>
51+
<artifactId>commons-lang3</artifactId>
52+
</dependency>
53+
<dependency>
54+
<groupId>org.slf4j</groupId>
55+
<artifactId>slf4j-api</artifactId>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.springframework.boot</groupId>
59+
<artifactId>spring-boot-starter-test</artifactId>
60+
</dependency>
61+
<dependency>
62+
<groupId>org.mybatis</groupId>
63+
<artifactId>mybatis</artifactId>
64+
<version>${mybatis.version}</version>
65+
</dependency>
66+
</dependencies>
67+
68+
<build>
69+
<plugins>
70+
<plugin>
71+
<groupId>org.springframework.boot</groupId>
72+
<artifactId>spring-boot-maven-plugin</artifactId>
73+
<configuration>
74+
<excludes>
75+
<exclude>
76+
<groupId>org.projectlombok</groupId>
77+
<artifactId>lombok</artifactId>
78+
</exclude>
79+
</excludes>
80+
</configuration>
81+
</plugin>
82+
</plugins>
83+
</build>
84+
85+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.github.weasleyj.mybatis.encrypt.annotation;
2+
3+
import io.github.weasleyj.mybatis.encrypt.config.MybatisEncryptConfiguration;
4+
import io.github.weasleyj.mybatis.encrypt.core.DefaultAesEncryptStrategyImpl;
5+
import io.github.weasleyj.mybatis.encrypt.core.DefaultBase64EncryptStrategyImpl;
6+
import io.github.weasleyj.mybatis.encrypt.interceptor.DefaultMybatisEncryptInterceptor;
7+
import org.springframework.context.annotation.Import;
8+
9+
import java.lang.annotation.Documented;
10+
import java.lang.annotation.ElementType;
11+
import java.lang.annotation.Inherited;
12+
import java.lang.annotation.Retention;
13+
import java.lang.annotation.RetentionPolicy;
14+
import java.lang.annotation.Target;
15+
16+
/**
17+
* To Enable autoconfiguration for Mybatis Encryption
18+
*
19+
* @author weasley
20+
* @version 1.0.0
21+
*/
22+
@Inherited
23+
@Documented
24+
@Target(ElementType.TYPE)
25+
@Retention(RetentionPolicy.RUNTIME)
26+
@Import({MybatisEncryptConfiguration.class, DefaultMybatisEncryptInterceptor.class, DefaultAesEncryptStrategyImpl.class, DefaultBase64EncryptStrategyImpl.class,})
27+
public @interface EnableMybatisEncryption {
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.github.weasleyj.mybatis.encrypt.annotation;
2+
3+
import java.lang.annotation.Documented;
4+
import java.lang.annotation.ElementType;
5+
import java.lang.annotation.Inherited;
6+
import java.lang.annotation.Retention;
7+
import java.lang.annotation.RetentionPolicy;
8+
import java.lang.annotation.Target;
9+
10+
/**
11+
* To annotate a field for encrypt and decrypt
12+
*
13+
* @author weasley
14+
* @version 1.0.0
15+
*/
16+
@Inherited
17+
@Documented
18+
@Target(ElementType.FIELD)
19+
@Retention(RetentionPolicy.RUNTIME)
20+
public @interface Encryption {
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package io.github.weasleyj.mybatis.encrypt.config;
2+
3+
import io.github.weasleyj.mybatis.encrypt.annotation.EnableMybatisEncryption;
4+
import io.github.weasleyj.mybatis.encrypt.constant.EncryptType;
5+
import io.github.weasleyj.mybatis.encrypt.core.DefaultAesEncryptStrategyImpl;
6+
import io.github.weasleyj.mybatis.encrypt.core.DefaultBase64EncryptStrategyImpl;
7+
import io.github.weasleyj.mybatis.encrypt.core.EncryptStrategy;
8+
import io.github.weasleyj.mybatis.encrypt.interceptor.DefaultMybatisEncryptInterceptor;
9+
import lombok.Getter;
10+
import org.apache.ibatis.session.SqlSessionFactory;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
import org.springframework.beans.factory.InitializingBean;
14+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
15+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
16+
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
17+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
18+
import org.springframework.context.annotation.Lazy;
19+
import org.springframework.objenesis.instantiator.util.ClassUtils;
20+
import org.springframework.stereotype.Component;
21+
22+
import java.util.List;
23+
import java.util.Map;
24+
import java.util.concurrent.ConcurrentHashMap;
25+
26+
import static io.github.weasleyj.mybatis.encrypt.config.MybatisEncryptProperties.AesProperties;
27+
import static io.github.weasleyj.mybatis.encrypt.constant.EncryptType.AES;
28+
import static io.github.weasleyj.mybatis.encrypt.constant.EncryptType.BASE64;
29+
import static io.github.weasleyj.mybatis.encrypt.constant.EncryptType.DIY;
30+
31+
/**
32+
* Mybatis Encrypt Configuration
33+
*
34+
* @author weasley
35+
* @version 1.0.0
36+
*/
37+
@Getter
38+
@Component
39+
@Lazy(value = false)
40+
@ConditionalOnClass({SqlSessionFactory.class})
41+
@ConditionalOnBean(annotation = {EnableMybatisEncryption.class})
42+
@EnableConfigurationProperties({MybatisEncryptProperties.class, AesProperties.class})
43+
@ConfigurationPropertiesScan(basePackages = {"io.github.weasleyj.mybatis.encrypt.config"})
44+
public class MybatisEncryptConfiguration implements InitializingBean {
45+
/**
46+
* The clients of encrypt strategies
47+
*/
48+
public static final Map<EncryptType, EncryptStrategy> STRATEGIES_CLIENTS = new ConcurrentHashMap<>(6);
49+
private final Logger logger = LoggerFactory.getLogger(this.getClass());
50+
private final AesProperties aesProperties;
51+
/**
52+
* The list of 'SqlSessionFactory'
53+
*/
54+
private final List<SqlSessionFactory> sqlSessionFactories;
55+
private final MybatisEncryptProperties mybatisEncryptProperties;
56+
private final DefaultMybatisEncryptInterceptor defaultMybatisEncryptInterceptor;
57+
58+
public MybatisEncryptConfiguration(AesProperties aesProperties,
59+
List<SqlSessionFactory> sqlSessionFactories,
60+
MybatisEncryptProperties mybatisEncryptProperties,
61+
DefaultMybatisEncryptInterceptor defaultMybatisEncryptInterceptor) {
62+
this.aesProperties = aesProperties;
63+
this.sqlSessionFactories = sqlSessionFactories;
64+
this.mybatisEncryptProperties = mybatisEncryptProperties;
65+
this.defaultMybatisEncryptInterceptor = defaultMybatisEncryptInterceptor;
66+
}
67+
68+
@Override
69+
public void afterPropertiesSet() throws Exception {
70+
sqlSessionFactories.forEach(sqlSessionFactory -> {
71+
org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
72+
if (null != configuration && !configuration.getInterceptors().contains(defaultMybatisEncryptInterceptor)) {
73+
configuration.addInterceptor(defaultMybatisEncryptInterceptor);
74+
}
75+
});
76+
if (null != mybatisEncryptProperties.getEncryptStrategy()) {
77+
STRATEGIES_CLIENTS.put(DIY, ClassUtils.newInstance(mybatisEncryptProperties.getEncryptStrategy()));
78+
}
79+
STRATEGIES_CLIENTS.put(BASE64, new DefaultBase64EncryptStrategyImpl());
80+
STRATEGIES_CLIENTS.put(AES, new DefaultAesEncryptStrategyImpl(aesProperties));
81+
}
82+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package io.github.weasleyj.mybatis.encrypt.config;
2+
3+
import io.github.weasleyj.mybatis.encrypt.constant.EncryptType;
4+
import io.github.weasleyj.mybatis.encrypt.core.EncryptStrategy;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
import lombok.experimental.Accessors;
9+
import org.springframework.boot.context.properties.ConfigurationProperties;
10+
11+
import static io.github.weasleyj.mybatis.encrypt.config.MybatisEncryptProperties.PREFIX;
12+
import static io.github.weasleyj.mybatis.encrypt.constant.EncryptType.BASE64;
13+
14+
/**
15+
* Mybatis Encrypt Properties
16+
*/
17+
@Data
18+
@NoArgsConstructor
19+
@AllArgsConstructor
20+
@Accessors(chain = true)
21+
@ConfigurationProperties(prefix = PREFIX)
22+
public class MybatisEncryptProperties {
23+
/**
24+
* The prefix of configuration properties
25+
*/
26+
public static final String PREFIX = "mybatis.encrypt";
27+
/**
28+
* enable encryption for mybatis
29+
*/
30+
private Boolean enable = true;
31+
/**
32+
* The type of encryption.
33+
*
34+
* @see EncryptType
35+
*/
36+
private EncryptType encryptType = BASE64;
37+
/**
38+
* Developer-defined encryption and decryption policies
39+
*/
40+
private Class<? extends EncryptStrategy> encryptStrategy = null;
41+
42+
/**
43+
* The configuration properties of AES
44+
*/
45+
@Data
46+
@NoArgsConstructor
47+
@AllArgsConstructor
48+
@Accessors(chain = true)
49+
@ConfigurationProperties(prefix = PREFIX + ".aes")
50+
public static class AesProperties {
51+
/**
52+
* The secret key for AES encrypt, the length must be 16.
53+
*/
54+
private String secretKey;
55+
/**
56+
* The offset for secretKey, the length must be 16.
57+
*/
58+
private String keyIv;
59+
60+
public String getKeyIv() {
61+
if (keyIv.length() != 16) {
62+
throw new IllegalArgumentException("The length of keyIv must be 16: " + keyIv);
63+
}
64+
return keyIv;
65+
}
66+
67+
public String getSecretKey() {
68+
if (secretKey.length() != 16) {
69+
throw new IllegalArgumentException("secret-key length must be 16: " + secretKey);
70+
}
71+
return secretKey;
72+
}
73+
}
74+
75+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package io.github.weasleyj.mybatis.encrypt.constant;
2+
3+
import java.math.BigDecimal;
4+
import java.util.*;
5+
6+
/**
7+
* The encryption constant
8+
*
9+
* @author weasley
10+
* @version 1.0.0
11+
*/
12+
public interface EncryptConstant {
13+
/**
14+
* SQL start with insert
15+
*/
16+
String INSERT = "INSERT";
17+
/**
18+
* SQL start with update
19+
*/
20+
String UPDATE = "UPDATE";
21+
/**
22+
* SQL start with select
23+
*/
24+
String SELECT = "SELECT";
25+
26+
/**
27+
* UNDERLYING_DATA_TYPES
28+
*/
29+
@SuppressWarnings({"all"})
30+
Set<Class<?>> UNDERLYING_DATA_TYPES = new HashSet<Class<?>>() {{
31+
add(String.class);
32+
add(Boolean.class);
33+
add(Short.class);
34+
add(Double.class);
35+
add(Integer.class);
36+
add(Long.class);
37+
add(BigDecimal.class);
38+
add(List.class);
39+
add(ArrayList.class);
40+
add(Collection.class);
41+
add(Map.class);
42+
add(HashMap.class);
43+
add(LinkedHashMap.class);
44+
add(Object.class);
45+
}};
46+
}

0 commit comments

Comments
 (0)