配置
有两种配置方法, yml
和 Bean
方式,看你喜欢哪一个,如果是对安全性要求较高,建议使用 Bean
方式动态设置密钥,而不是写在 yml
里。
yml模式
下面是
yml
的完整配置,有些配置项是可选的,在注解中均已解释
secure-api:
# 开启SecureApi功能,如果为false则其余配置项均不生效
enabled: true
# 生成的key和密文等是否是符合url规范的,默认开启,开启后与前端配合时前端要自行处理密文的 url safe 转换,在 "JS示例" 篇有代码示例
url-safe: true
# 开启加解密日志打印,会打印出接口名、加密模式、算法、明文和密文等信息
show-log: true
# 加密模式,common和session_key可选,session_key是会话密钥模式,用于每次请求都使用不同的密钥,需要前端配合
mode: common
# 加密算法
cipher-algorithm: rsa_ecb_sha256
# session_key模式配置项,与前端协商的会话密钥类型,common模式下此配置不生效
session-key-cipher-algorithm: aes_ecb_pkcs5
# 对称算法用于加解密的密钥,Base64格式,cipher-algorithm选择对称加密算法时配置,也可为空,组件会随机生成一个
key:
# 对称算法用于加解密的偏移量,Base64格式,cipher-algorithm选择对称加密算法时配置,也可为空,组件会随机生成一个
iv:
# 非对称算法用于加密的公钥,Base64格式,cipher-algorithm选择RSA非对称加密算法时配置,也可为空,组件会随机生成一对
public-key:
# 非对称算法用于解密的私钥,Base64格式,cipher-algorithm选择RSA非对称加密算法时配置,也可为空,组件会随机生成一对
private-key:
# 需要加密的接口路径匹配,遵循spring boot拦截器的正则规则,留空或者不配置代表不使用url匹配,只对注解的接口进行解密
encrypt-url:
# 配置了此项,接口有无注解都将进行返回值加密
include-urls: /**
# 即使配置了排除,注解的优先级也高于此项
exclude-urls: /test1,/test2
# 需要解密的接口路径匹配,遵循spring boot拦截器的正则规则,留空或者不配置代表不使用url匹配,只对注解的接口、参数、字段进行解密
decrypt-url:
# 配置了此项,接口、参数、字段有无注解都将进行解密
include-urls: /**
# 即使配置了排除,注解的优先级也高于此项
exclude-urls:
# Date类型日期格式化
date-format: yyyy-MM-dd HH:mm:ss
# LocalDateTime类型日期格式化
local-date-time-format: yyyy-MM-dd HH:mm:ss
# LocalDate类型日期格式化
local-date-format: yyyy-MM-dd
# LocalTime类型日期格式化
local-time-format: HH:mm:ss
Bean方式
注意,一旦使用了
Bean
方式来配置,yml
里的配置项都将失效
import icu.xuyijie.secureapi.cipher.CipherAlgorithmEnum;
import icu.xuyijie.secureapi.cipher.CipherUtils;
import icu.xuyijie.secureapi.cipher.RsaKeyPair;
import icu.xuyijie.secureapi.model.SecureApiProperties;
import icu.xuyijie.secureapi.model.SecureApiPropertiesConfig;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import java.util.ArrayList;
import java.util.Arrays;
@SpringBootConfiguration
public class SecureApiConfig {
/**
* 这里的配置了Bean会导致yml配置的数据失效
* @return SecureApiPropertiesConfig
*/
@Bean
public SecureApiPropertiesConfig secureApiPropertiesConfig() {
SecureApiPropertiesConfig secureApiPropertiesConfig = new SecureApiPropertiesConfig();
secureApiPropertiesConfig.setEnabled(true);
// 生成的key和密文是符合url规范的,默认开启,开启后与前端配合时前端要自行处理密文的 url safe 转换,在 "JS示例" 篇有代码示例
secureApiPropertiesConfig.setUrlSafe(true);
secureApiPropertiesConfig.setShowLog(true);
secureApiPropertiesConfig.setMode(SecureApiProperties.Mode.COMMON);
secureApiPropertiesConfig.setCipherAlgorithmEnum(CipherAlgorithmEnum.RSA_ECB_SHA256);
// 密钥可以不设置,组件会自动生成一个,并打印在控制台,如果需要手动生成,只需要使用组件提供的CipherUtils
CipherUtils cipherUtils = new CipherUtils(CipherAlgorithmEnum.RSA_ECB_SHA256);
// 因为我们选择的是非对称加密RSA,所以生成一个密钥对,getRandomRsaKeyPair("1")可传入seed参数,在测试时可用于控制每次生成的密钥相同
RsaKeyPair randomRsaKeyPair = cipherUtils.getRandomRsaKeyPair();
// 把生成的密钥对设置到secureApiPropertiesConfig
secureApiPropertiesConfig.setPublicKey(randomRsaKeyPair.getPublicKey());
secureApiPropertiesConfig.setPrivateKey(randomRsaKeyPair.getPrivateKey());
// 不需要使用url匹配功能可以删除掉下面两行,或者传入空数组
// secureApiPropertiesConfig.setEncryptUrl(new SecureApiProperties.UrlPattern(Arrays.asList("/**"), new ArrayList<>()));
// secureApiPropertiesConfig.setDecryptUrl(new SecureApiProperties.UrlPattern(Arrays.asList("/**"), Arrays.asList("/secureApiTest/testForm")));
return secureApiPropertiesConfig;
}
}