diff --git a/opsli-api/src/main/java/org/opsli/api/web/system/options/OptionsApi.java b/opsli-api/src/main/java/org/opsli/api/web/system/options/OptionsApi.java index 7cf56a79..2129dd0b 100644 --- a/opsli-api/src/main/java/org/opsli/api/web/system/options/OptionsApi.java +++ b/opsli-api/src/main/java/org/opsli/api/web/system/options/OptionsApi.java @@ -149,7 +149,7 @@ public interface OptionsApi { * @param optionCode 参数编号 * @return ResultWrapper */ - @GetMapping("/getByCode") + //@GetMapping("/getByCode") ResultWrapper getByCode(String optionCode); /** @@ -163,7 +163,7 @@ public interface OptionsApi { * 系统参数 查询全部 * @return ResultWrapper */ - @GetMapping("/findAll") + //@GetMapping("/findAll") ResultWrapper> findAll(); /** diff --git a/opsli-api/src/main/java/org/opsli/api/wrapper/system/options/OptionsModel.java b/opsli-api/src/main/java/org/opsli/api/wrapper/system/options/OptionsModel.java index f7474ed0..e96d4ef1 100644 --- a/opsli-api/src/main/java/org/opsli/api/wrapper/system/options/OptionsModel.java +++ b/opsli-api/src/main/java/org/opsli/api/wrapper/system/options/OptionsModel.java @@ -38,8 +38,8 @@ import org.opsli.plugins.excel.annotation.ExcelInfo; @EqualsAndHashCode(callSuper = false) public class OptionsModel extends ApiWrapper { - - + + /** 参数编号 */ @ApiModelProperty(value = "参数编号") @ExcelProperty(value = "参数编号", order = 1) @@ -57,21 +57,21 @@ public class OptionsModel extends ApiWrapper { /** 参数值 */ @ApiModelProperty(value = "参数值") - @ExcelProperty(value = "参数值", order = 3) + @ExcelProperty(value = "参数值", order = 4) @ExcelInfo @ValidatorLenMax(10000) private String optionValue; /** 是否内置数据 0否 1是*/ @ApiModelProperty(value = "是否内置数据 0否 1是") - @ExcelProperty(value = "是否内置数据", order = 4) + @ExcelProperty(value = "是否内置数据", order = 5) @ExcelInfo(dictType = "no_yes") @ValidatorLenMax(1) private String izLock; /** 备注 */ @ApiModelProperty(value = "备注") - @ExcelProperty(value = "备注", order = 5) + @ExcelProperty(value = "备注", order = 6) @ExcelInfo @ValidatorLenMax(255) private String remark; diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java index 0dd63897..ea893870 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/ApiPathProperties.java @@ -18,6 +18,7 @@ package org.opsli.core.autoconfigure.properties; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; /** @@ -26,7 +27,7 @@ import org.springframework.stereotype.Component; * @author Parker * @date 2020-09-15 */ -@Component +@Configuration @ConfigurationProperties(prefix = ApiPathProperties.PROP_PREFIX) @Data @EqualsAndHashCode(callSuper = false) diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java index 38ea5651..16e074dc 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/CacheProperties.java @@ -18,6 +18,7 @@ package org.opsli.core.autoconfigure.properties; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; /** @@ -26,7 +27,7 @@ import org.springframework.stereotype.Component; * @author Parker * @date 2020-09-15 */ -@Component +@Configuration @ConfigurationProperties(prefix = CacheProperties.PROP_PREFIX) @Data @EqualsAndHashCode(callSuper = false) diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java new file mode 100644 index 00000000..8e21aec1 --- /dev/null +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/EncryptProperties.java @@ -0,0 +1,25 @@ +package org.opsli.core.autoconfigure.properties; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +/** + * 加密配置加载 + * + * @author Parker + * @date 2022-08-07 + */ +@Configuration +@ConfigurationProperties(prefix = EncryptProperties.PROP_PREFIX) +@Data +@EqualsAndHashCode(callSuper = false) +public class EncryptProperties { + + public static final String PROP_PREFIX = "opsli.data-encrypt"; + + /** 秘钥 */ + private String key; + +} diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java index 007fc5e2..38d3bd1e 100644 --- a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/autoconfigure/properties/TokenProperties.java @@ -18,6 +18,7 @@ package org.opsli.core.autoconfigure.properties; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; import org.springframework.stereotype.Component; /** @@ -26,7 +27,7 @@ import org.springframework.stereotype.Component; * @author Parker * @date 2020-09-15 */ -@Component +@Configuration @ConfigurationProperties(prefix = TokenProperties.PROP_PREFIX) @Data @EqualsAndHashCode(callSuper = false) diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java new file mode 100644 index 00000000..f9cb9b1c --- /dev/null +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/filters/interceptor/MybatisCryptoInterceptor.java @@ -0,0 +1,336 @@ +package org.opsli.core.filters.interceptor; + + +import cn.hutool.core.util.StrUtil; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import opsli.plugins.crypto.spring.annotation.CryptoMapperField; +import opsli.plugins.crypto.spring.crypto.ICrypto; +import opsli.plugins.crypto.spring.enums.CryptoType; +import org.apache.ibatis.cache.CacheKey; +import org.apache.ibatis.executor.Executor; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.plugin.*; +import org.apache.ibatis.session.ResultHandler; +import org.apache.ibatis.session.RowBounds; +import org.opsli.core.autoconfigure.properties.EncryptProperties; +import org.springframework.stereotype.Component; +import java.lang.reflect.*; +import java.time.chrono.ChronoLocalDate; +import java.util.*; + +/** + * Mybatis 拦截器 + *

+ * Signature:定义拦截点,只有符合拦截点的条件才会进入到拦截器 + * Signature.type:定义拦截的类 Executor、ParameterHandler、StatementHandler、ResultSetHandler 当中的一个 + * Signature.method:在定义拦截类的基础之上,在定义拦截的方法 + * Signature.args:在定义拦截方法的基础之上在定义拦截的方法对应的参数,JAVA里面方法可能重载,故注意参数的类型和顺序 + * + * @author Parker + * @date 2022-08-07 + */ +@Slf4j +@AllArgsConstructor +@Component +@Intercepts( + { + @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), + @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}), + @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), + } +) +public class MybatisCryptoInterceptor implements Interceptor { + + private final EncryptProperties encryptProperties; + + /** + * @param invocation 拦截到对象 + * @return + * @throws Throwable + */ + @Override + public Object intercept(Invocation invocation) throws Throwable { + Method method = invocation.getMethod(); + + switch (method.getName()) { + case "update": + return updateHandle(invocation); + case "query": + return selectHandle(invocation); + default: + return invocation.proceed(); + } + + } + + /** + * 查询操作处理 + * + * @param invocation + * @return + * @throws Throwable + */ + private Object selectHandle(Invocation invocation) throws Throwable { + Object[] args = invocation.getArgs(); + MappedStatement ms = (MappedStatement) args[0]; + Object parameter = args[1]; + RowBounds rowBounds = (RowBounds) args[2]; + ResultHandler resultHandler = (ResultHandler) args[3]; + Executor executor = (Executor) invocation.getTarget(); + + CacheKey cacheKey; + BoundSql boundSql; + + //处理参数作为条件查询需要加密 + handleParameterOrResult(parameter, CryptoType.ENCRYPT); + + //由于逻辑关系,只会进入一次 + if (args.length == 4) { + //4 个参数时 + boundSql = ms.getBoundSql(parameter); + cacheKey = executor.createCacheKey(ms, parameter, rowBounds, boundSql); + } else { + //6 个参数时 + cacheKey = (CacheKey) args[4]; + boundSql = (BoundSql) args[5]; + } + + List resultList = executor.query(ms, parameter, rowBounds, resultHandler, cacheKey, boundSql); + + for (Object o : resultList) { + handleParameterOrResult(o, CryptoType.DECRYPT); + } + + return resultList; + } + + /** + * 新增修改操作处理 + * + * @param invocation + * @return + * @throws Throwable + */ + private Object updateHandle(Invocation invocation) throws Throwable { + //处理参数 + handleParameterOrResult(invocation.getArgs()[1], CryptoType.ENCRYPT); + return invocation.proceed(); + } + + /** + * 处理参数或结果 + * + * @param object + * @param cryptoType + * @throws IllegalAccessException + */ + private void handleParameterOrResult(Object object, CryptoType cryptoType) throws IllegalAccessException { + HashMap fieldObjectHashMap = new HashMap<>(); + //多个参数 + if (object instanceof Map) { + Map paramMap = (Map) object; + Set keySet = paramMap.keySet(); + for (Object key : keySet) { + Object o = paramMap.get(key); + if (o != null) { + handleObject(o, o.getClass(), fieldObjectHashMap); + } + + } + } else { + if (object != null) { + handleObject(object, object.getClass(), fieldObjectHashMap); + } + } + + //统一修改加密解密值 + fieldObjectHashMap.keySet().forEach(key -> { + try { + handleString(key, fieldObjectHashMap.get(key), cryptoType); + } catch (Exception e) { + e.printStackTrace(); + } + }); + } + + /** + * 是否是基本类型 + * + * @param type + * @return + */ + private boolean isBase(Type type) { + return boolean.class.equals(type) || + char.class.equals(type) || + long.class.equals(type) || + int.class.equals(type) || + byte.class.equals(type) || + short.class.equals(type) || + double.class.equals(type) || + float.class.equals(type); + } + + /** + * 是否是 + * + * @param object + * @return + */ + private boolean isFilter(Object object) { + + return object == null || object instanceof CharSequence || object instanceof Number || object instanceof Collection || object instanceof Date || object instanceof ChronoLocalDate; + } + + /** + * 聚合父类属性 + * + * @param oClass + * @param fields + * @return + */ + private List mergeField(Class oClass, List fields) { + if (fields == null) { + fields = new ArrayList<>(); + } + Class superclass = oClass.getSuperclass(); + if (superclass != null && !superclass.equals(Object.class) && superclass.getDeclaredFields().length > 0) { + mergeField(superclass, fields); + } + for (Field declaredField : oClass.getDeclaredFields()) { + + int modifiers = declaredField.getModifiers(); + + if (Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers) || Modifier.isVolatile(modifiers) || Modifier.isSynchronized(modifiers)) { + continue; + } + fields.add(declaredField); + } + + return fields; + + } + + /** + * 处理Object + * + * @param obj + * @param oClass + * @throws IllegalAccessException + */ + private void handleObject(Object obj, Class oClass, HashMap fieldObjectHashMap) throws IllegalAccessException { + //过滤 + if (isFilter(obj)) { + return; + } + + List fields = mergeField(oClass, null); + + for (Field declaredField : fields) { + + //静态属性直接跳过 + if (Modifier.isStatic(declaredField.getModifiers())) { + continue; + } + + boolean accessible = declaredField.isAccessible(); + declaredField.setAccessible(true); + Object value = declaredField.get(obj); + declaredField.setAccessible(accessible); + + if (value == null) { + // TODO + continue; + } else if (value instanceof Number) { + // TODO + continue; + } else if (value instanceof String) { + CryptoMapperField annotation = declaredField.getAnnotation(CryptoMapperField.class); + if (annotation != null) { + fieldObjectHashMap.put(declaredField, obj); + } + + } else if (value instanceof Collection) { + Collection coll = (Collection) value; + for (Object o : coll) { + if (isFilter(o)) { + //默认集合内类型一致 + break; + } + handleObject(o, o.getClass(), fieldObjectHashMap); + } + } else { + handleObject(value, value.getClass(), fieldObjectHashMap); + } + } + + } + + /** + * 处理字符 + * + * @param field + * @param object + * @param cryptoType + * @throws IllegalAccessException + * @throws InstantiationException + * @throws NoSuchMethodException + * @throws InvocationTargetException + */ + private void handleString(Field field, Object object, CryptoType cryptoType) throws Exception { + + boolean accessible = field.isAccessible(); + field.setAccessible(true); + Object value = field.get(object); + + CryptoMapperField annotation = field.getAnnotation(CryptoMapperField.class); + if (annotation != null) { + + String key; + //全局配置的key + String propertiesKey = encryptProperties.getKey(); + log.debug("全局key是:" + propertiesKey); + //属性上的key + String annotationKey = annotation.key(); + log.debug("注解key是:" + annotationKey); + + if (StrUtil.isNotBlank(annotationKey)) { + key = annotationKey; + } else { + key = propertiesKey; + } + + Class iCryptoImpl = annotation.iCrypto(); + ICrypto iCrypto = iCryptoImpl.newInstance(); + + //解密后的值 + String valueResult; + if (cryptoType.equals(CryptoType.DECRYPT)) { + valueResult = iCrypto.decrypt(String.valueOf(value), key); + } else { + valueResult = iCrypto.encrypt(String.valueOf(value), key); + } + + log.debug("原值:" + value); + log.debug("现在:" + valueResult); + field.set(object, String.valueOf(valueResult)); + field.setAccessible(accessible); + } + } + + /** + * 是否要进行拦截,然后做出决定是否生成一个代理。 + * + * @param target + * @return + */ + @Override + public Object plugin(Object target) { + return Plugin.wrap(target, this); + } + + @Override + public void setProperties(Properties properties) { + } +} diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java new file mode 100644 index 00000000..1d2b528d --- /dev/null +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunCaptchaConfigFactory.java @@ -0,0 +1,81 @@ +/** + * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.opsli.core.options; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.opsli.common.annotation.OptionDict; +import org.opsli.common.annotation.validator.Validator; +import org.opsli.common.enums.ValidatorType; +import org.opsli.core.utils.OptionsUtil; +import org.opsli.core.utils.ValidatorUtil; + +import java.io.Serializable; + +/** + * 阿里云短信-验证码配置 + * + * @author Parker + * @date 2020-09-19 20:03 + */ +public enum SmsAliYunCaptchaConfigFactory { + + /** 实例对象 */ + INSTANCE; + + /** + * 获得配置信息 + * @return LocalConfig + */ + public SmsAliYunCaptchaConfigOption getConfig() { + SmsAliYunCaptchaConfigOption option = new SmsAliYunCaptchaConfigOption(); + // 获得缓存参数配置 + OptionsUtil.getOptionByBean(option); + // 验证配置 + ValidatorUtil.verify(option); + + // 转化对象 + return option; + } + + + // ======================= + + /** + * 阿里云短信验证码配置 + * + * @author Parker + */ + @Data + public static class SmsAliYunCaptchaConfigOption implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 模版编码 */ + @ApiModelProperty(value = "模版编码") + @Validator({ValidatorType.IS_NOT_NULL}) + @OptionDict("sms_aliyun_captcha_template_code") + private String templateCode; + + /** 签名 */ + @ApiModelProperty(value = "签名") + @Validator({ValidatorType.IS_NOT_NULL}) + @OptionDict("sms_aliyun_captcha_sign") + private String sign; + + } + +} diff --git a/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java new file mode 100644 index 00000000..6df9f1a3 --- /dev/null +++ b/opsli-base-support/opsli-core/src/main/java/org/opsli/core/options/SmsAliYunConfigFactory.java @@ -0,0 +1,81 @@ +/** + * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package org.opsli.core.options; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.opsli.common.annotation.OptionDict; +import org.opsli.common.annotation.validator.Validator; +import org.opsli.common.enums.ValidatorType; +import org.opsli.core.utils.OptionsUtil; +import org.opsli.core.utils.ValidatorUtil; + +import java.io.Serializable; + +/** + * 阿里云短信配置 + * + * @author Parker + * @date 2020-09-19 20:03 + */ +public enum SmsAliYunConfigFactory { + + /** 实例对象 */ + INSTANCE; + + /** + * 获得配置信息 + * @return LocalConfig + */ + public SmsAliYunConfigOption getConfig() { + SmsAliYunConfigOption option = new SmsAliYunConfigOption(); + // 获得缓存参数配置 + OptionsUtil.getOptionByBean(option); + // 验证配置 + ValidatorUtil.verify(option); + + // 转化对象 + return option; + } + + + // ======================= + + /** + * 阿里云短信配置 + * + * @author Parker + */ + @Data + public static class SmsAliYunConfigOption implements Serializable { + + private static final long serialVersionUID = 1L; + + /** access_key */ + @ApiModelProperty(value = "阿里云AccessKey") + @Validator({ValidatorType.IS_NOT_NULL}) + @OptionDict("sms_aliyun_access_key") + private String accessKey; + + /** access_key_secret */ + @ApiModelProperty(value = "阿里云AccessKeySecret") + @Validator({ValidatorType.IS_NOT_NULL}) + @OptionDict("sms_aliyun_access_key_secret") + private String accessKeySecret; + + } + +} diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/entity/SysOptions.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/entity/SysOptions.java index 026fce46..807f5147 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/entity/SysOptions.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/entity/SysOptions.java @@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import lombok.Data; import lombok.EqualsAndHashCode; +import opsli.plugins.crypto.spring.annotation.CryptoMapperField; import org.opsli.core.base.entity.BaseEntity; /** @@ -42,12 +43,16 @@ public class SysOptions extends BaseEntity { private String optionName; /** 参数值 */ + @CryptoMapperField @TableField(updateStrategy = FieldStrategy.IGNORED) private String optionValue; /** 是否内置数据 0否 1是*/ private String izLock; + /** 是否忽略 0否 1是*/ + private String izExclude; + /** 备注 */ @TableField(updateStrategy = FieldStrategy.IGNORED) private String remark; diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/service/impl/SysOptionsServiceImpl.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/service/impl/SysOptionsServiceImpl.java index 0f6bfa17..48f1e99b 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/service/impl/SysOptionsServiceImpl.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/service/impl/SysOptionsServiceImpl.java @@ -19,6 +19,7 @@ package org.opsli.modulars.system.options.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -39,6 +40,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; @@ -146,53 +148,49 @@ public class SysOptionsServiceImpl extends CrudServiceImpl optionsCode = Lists.newArrayList(); - optionsCode.addAll(params.keySet()); + List optionsCodeList = Lists.newArrayList(); + optionsCodeList.addAll(params.keySet()); // 获得所有的原始内容 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.in("option_code", optionsCode); + queryWrapper.in("option_code", optionsCodeList); List optionsList = this.findList(queryWrapper); - Map resourceDataDict = Maps.newHashMap(); + Map resourceDataDict = Maps.newHashMap(); for (SysOptions option : optionsList) { - resourceDataDict.put(option.getOptionCode(), - transformT2M(option) - ); + resourceDataDict.put(option.getOptionCode(), option); } + List updateOptionsModelList = new ArrayList<>(); // 循环修改 for (Map.Entry entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); - OptionsModel optionsModel = resourceDataDict.get(key); - if(optionsModel == null){ - optionsModel = new OptionsModel(); - // 新增参数 - - // 设置值 - optionsModel.setIzApi(true); - optionsModel.setOptionCode(key); - optionsModel.setOptionValue(value); - optionsModel.setVersion(0); - // 强制设置为内置数据 - optionsModel.setIzLock(DictType.NO_YES_YES.getValue()); - - // 更新 - this.insert(optionsModel); - }else { - // 修改参数 - - // 设置值 - optionsModel.setIzApi(true); - optionsModel.setOptionValue(value); - // 强制设置为内置数据 - optionsModel.setIzLock(DictType.NO_YES_YES.getValue()); - - // 更新 - this.update(optionsModel); + SysOptions options = resourceDataDict.get(key); + if(null == options){ + options = new SysOptions(); } + + // 如果是 排除字段 且 传入参数为空 则 不处理 + if(DictType.NO_YES_YES.getValue().equals(options.getIzExclude()) + && StrUtil.isBlank(value)){ + continue; + } + + // 设置值 + options.setIzApi(true); + options.setOptionValue(value); + // 强制设置为内置数据 + options.setIzLock(DictType.NO_YES_YES.getValue()); + + // 更新 + this.saveOrUpdate(options); + + updateOptionsModelList.add(transformT2M(options)); } + + // 清除缓存 + this.clearCache(updateOptionsModelList); } @Override diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/web/SysOptionsRestController.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/web/SysOptionsRestController.java index bf79e705..c57ebda9 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/web/SysOptionsRestController.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/system/options/web/SysOptionsRestController.java @@ -267,7 +267,7 @@ public class SysOptionsRestController extends BaseRestController queryWrapper = new QueryWrapper<>(); // 查询内置数据 queryWrapper.eq("iz_lock", DictType.NO_YES_YES.getValue()); + // 查询不忽略的数据 + queryWrapper.eq("iz_exclude", DictType.NO_YES_NO.getValue()); + // 数据库查询数据 List allList = IService.findList(queryWrapper); + return ResultWrapper.getSuccessResultWrapper( OptionsUtil.convertOptionsMap( WrapperUtil.transformInstance(allList, OptionsModel.class)) diff --git a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/tools/common/bean/VerificationCodeBean.java b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/tools/common/bean/VerificationCodeBean.java index f064ce92..4f47f4be 100644 --- a/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/tools/common/bean/VerificationCodeBean.java +++ b/opsli-modulars/opsli-modulars-system/src/main/java/org/opsli/modulars/tools/common/bean/VerificationCodeBean.java @@ -21,6 +21,8 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.opsli.core.autoconfigure.properties.GlobalProperties; import org.opsli.core.options.EmailConfigFactory; +import org.opsli.core.options.SmsAliYunCaptchaConfigFactory; +import org.opsli.core.options.SmsAliYunConfigFactory; import org.opsli.core.utils.EnjoyUtil; import org.opsli.core.utils.VerificationCodeUtil; import org.opsli.plugins.email.EmailPlugin; @@ -43,11 +45,6 @@ import java.util.Map; @Component public class VerificationCodeBean { private static final String EMAIL_FTL = "/email/email_code.ftl"; - /** TODO 短信签名 请修改 */ - private static final String SMS_SIGN_NAME = "阿里云短信测试"; - /** TODO 短信模版编号 请修改 */ - private static final String SMS_TEMPLATE_CODE = "SMS_154950909"; - private final EmailPlugin emailPlugin; private final GlobalProperties globalProperties; @@ -81,11 +78,19 @@ public class VerificationCodeBean { VerificationCodeUtil.VerificationCodeModel verificationCodeModel = VerificationCodeUtil.createMobileCode(mobile, type); + SmsAliYunConfigFactory.SmsAliYunConfigOption aliYunConfigOption = + SmsAliYunConfigFactory.INSTANCE.getConfig(); + + SmsAliYunCaptchaConfigFactory.SmsAliYunCaptchaConfigOption aliYunCaptchaConfigOption = + SmsAliYunCaptchaConfigFactory.INSTANCE.getConfig(); + Map templateParam = MapUtil.newHashMap(1); templateParam.put("code", verificationCodeModel.getVerificationCode()); SmsModel smsModel = SmsModel.builder() - .signName(SMS_SIGN_NAME) - .templateCode(SMS_TEMPLATE_CODE) + .accessKey(aliYunConfigOption.getAccessKey()) + .accessKeySecret(aliYunConfigOption.getAccessKeySecret()) + .signName(aliYunCaptchaConfigOption.getSign()) + .templateCode(aliYunCaptchaConfigOption.getTemplateCode()) .templateParam(templateParam) .tels(Collections.singletonList(mobile)) .build(); diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/model/CryptoSymmetric.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/model/CryptoSymmetric.java index edaf50f7..7c4a52f4 100644 --- a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/model/CryptoSymmetric.java +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/model/CryptoSymmetric.java @@ -15,7 +15,10 @@ */ package opsli.plugins.crypto.model; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import opsli.plugins.crypto.enums.CryptoSymmetricType; /** @@ -25,6 +28,9 @@ import opsli.plugins.crypto.enums.CryptoSymmetricType; * @date 2021年5月17日15:59:52 */ @Data +@Builder +@AllArgsConstructor +@NoArgsConstructor public class CryptoSymmetric { /** 加解密类别 */ diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/annotation/CryptoMapperField.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/annotation/CryptoMapperField.java new file mode 100644 index 00000000..0c02f676 --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/annotation/CryptoMapperField.java @@ -0,0 +1,36 @@ +package opsli.plugins.crypto.spring.annotation; + + + +import opsli.plugins.crypto.spring.crypto.ICrypto; +import opsli.plugins.crypto.spring.crypto.impl.AESCrypto; + +import java.lang.annotation.*; + +/** + * 字段加密 + * 注意注解只能放在可以被 mybatis Interceptor拦截器拦截的实体上 才能生效 + * + * @author Parker + * @date 2022-08-07 17:33 + */ +@Documented +@Inherited +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE}) +public @interface CryptoMapperField { + + /** + * 秘钥 (加密口令,盐) + * 优先 走全局配置 encrypt.property.key + * @return String + */ + String key() default "0546c7b2790448658a1816a7803d7ba1"; + + /** + * 加密解密器 + * @return Class + */ + Class iCrypto() default AESCrypto.class; + +} diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/ICrypto.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/ICrypto.java new file mode 100644 index 00000000..e919b214 --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/ICrypto.java @@ -0,0 +1,29 @@ +package opsli.plugins.crypto.spring.crypto; + +/** + * 加密解密器 可自行实现 + * + * @author zhangylo + */ +public interface ICrypto { + + /** + * 加密 + * + * @param value 加密前的值 + * @param key 秘钥 + * @return 加密后的值 + * @throws Exception + */ + String encrypt(String value, String key) throws Exception; + + /** + * 解密 + * + * @param value 解密前的值 + * @param key 秘钥 + * @return 解密后的值 + * @throws Exception + */ + String decrypt(String value, String key) throws Exception; +} diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/AESCrypto.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/AESCrypto.java new file mode 100644 index 00000000..b65dee0a --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/AESCrypto.java @@ -0,0 +1,53 @@ +package opsli.plugins.crypto.spring.crypto.impl; + + +import lombok.extern.slf4j.Slf4j; +import opsli.plugins.crypto.CryptoPlugin; +import opsli.plugins.crypto.enums.CryptoSymmetricType; +import opsli.plugins.crypto.model.CryptoSymmetric; +import opsli.plugins.crypto.spring.crypto.ICrypto; +import opsli.plugins.crypto.strategy.CryptoSymmetricService; + +/** + * AES 加密解密器 + * + * @author Parker + * @date 2022-08-07 17:33 + */ +@Slf4j +public class AESCrypto implements ICrypto { + + /** + * 加密 + * + * @param value 加密前的值 + * @param key 秘钥 + * @return 加密后的值 + */ + @Override + public String encrypt(String value, String key) throws Exception { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.AES) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.encrypt(cryptoSymmetric, value); + } + + /** + * 解密 + * + * @param value 解密前的值 + * @param key 秘钥 + * @return 解密后的值 + */ + @Override + public String decrypt(String value, String key) { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.AES) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.decrypt(cryptoSymmetric, value); + } +} diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/DESCrypto.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/DESCrypto.java new file mode 100644 index 00000000..5e141dba --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/DESCrypto.java @@ -0,0 +1,53 @@ +package opsli.plugins.crypto.spring.crypto.impl; + + +import lombok.extern.slf4j.Slf4j; +import opsli.plugins.crypto.CryptoPlugin; +import opsli.plugins.crypto.enums.CryptoSymmetricType; +import opsli.plugins.crypto.model.CryptoSymmetric; +import opsli.plugins.crypto.spring.crypto.ICrypto; +import opsli.plugins.crypto.strategy.CryptoSymmetricService; + +/** + * DES 加密解密器 + * + * @author Parker + * @date 2022-08-07 17:33 + */ +@Slf4j +public class DESCrypto implements ICrypto { + + /** + * 加密 + * + * @param value 加密前的值 + * @param key 秘钥 + * @return 加密后的值 + */ + @Override + public String encrypt(String value, String key) throws Exception { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.DES) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.encrypt(cryptoSymmetric, value); + } + + /** + * 解密 + * + * @param value 解密前的值 + * @param key 秘钥 + * @return 解密后的值 + */ + @Override + public String decrypt(String value, String key) { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.DES) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.decrypt(cryptoSymmetric, value); + } +} diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/DESEDECrypto.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/DESEDECrypto.java new file mode 100644 index 00000000..25a42345 --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/DESEDECrypto.java @@ -0,0 +1,53 @@ +package opsli.plugins.crypto.spring.crypto.impl; + + +import lombok.extern.slf4j.Slf4j; +import opsli.plugins.crypto.CryptoPlugin; +import opsli.plugins.crypto.enums.CryptoSymmetricType; +import opsli.plugins.crypto.model.CryptoSymmetric; +import opsli.plugins.crypto.spring.crypto.ICrypto; +import opsli.plugins.crypto.strategy.CryptoSymmetricService; + +/** + * DES 加密解密器 + * + * @author Parker + * @date 2022-08-07 17:33 + */ +@Slf4j +public class DESEDECrypto implements ICrypto { + + /** + * 加密 + * + * @param value 加密前的值 + * @param key 秘钥 + * @return 加密后的值 + */ + @Override + public String encrypt(String value, String key) throws Exception { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.DE_SEDE) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.encrypt(cryptoSymmetric, value); + } + + /** + * 解密 + * + * @param value 解密前的值 + * @param key 秘钥 + * @return 解密后的值 + */ + @Override + public String decrypt(String value, String key) { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.DE_SEDE) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.decrypt(cryptoSymmetric, value); + } +} diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/SM4Crypto.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/SM4Crypto.java new file mode 100644 index 00000000..19fe3419 --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/crypto/impl/SM4Crypto.java @@ -0,0 +1,53 @@ +package opsli.plugins.crypto.spring.crypto.impl; + + +import lombok.extern.slf4j.Slf4j; +import opsli.plugins.crypto.CryptoPlugin; +import opsli.plugins.crypto.enums.CryptoSymmetricType; +import opsli.plugins.crypto.model.CryptoSymmetric; +import opsli.plugins.crypto.spring.crypto.ICrypto; +import opsli.plugins.crypto.strategy.CryptoSymmetricService; + +/** + * 国密4 加密解密器 + * + * @author Parker + * @date 2022-08-07 17:33 + */ +@Slf4j +public class SM4Crypto implements ICrypto { + + /** + * 加密 + * + * @param value 加密前的值 + * @param key 秘钥 + * @return 加密后的值 + */ + @Override + public String encrypt(String value, String key) throws Exception { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.SM4) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.encrypt(cryptoSymmetric, value); + } + + /** + * 解密 + * + * @param value 解密前的值 + * @param key 秘钥 + * @return 解密后的值 + */ + @Override + public String decrypt(String value, String key) { + CryptoSymmetric cryptoSymmetric = CryptoSymmetric.builder() + .cryptoType(CryptoSymmetricType.SM4) + .privateKey(key) + .build(); + CryptoSymmetricService symmetric = CryptoPlugin.getSymmetric(); + return symmetric.decrypt(cryptoSymmetric, value); + } +} diff --git a/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/enums/CryptoType.java b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/enums/CryptoType.java new file mode 100644 index 00000000..c53487c1 --- /dev/null +++ b/opsli-plugins/opsli-plugins-crypto/src/main/java/opsli/plugins/crypto/spring/enums/CryptoType.java @@ -0,0 +1,32 @@ +package opsli.plugins.crypto.spring.enums; + +/** + * 加密解密枚举 + * + * @author zhangylo + */ +public enum CryptoType { + + /** + * ENCRYPT 加密 + * DECRYPT 解密 + */ + ENCRYPT("com/encrypt"), DECRYPT("decrypt"); + + /** + * 对应加密器方法名称 + */ + private String method; + + CryptoType(String method) { + this.method = method; + } + + public String getMethod() { + return method; + } + + public void setMethod(String method) { + this.method = method; + } +} diff --git a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/conf/AliYunSmsProperties.java b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/conf/AliYunSmsProperties.java deleted file mode 100644 index 15d46a50..00000000 --- a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/conf/AliYunSmsProperties.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright 2020 OPSLI 快速开发平台 https://www.opsli.com - *

- * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - *

- * http://www.apache.org/licenses/LICENSE-2.0 - *

- * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ -package org.opsli.plugins.sms.conf; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * 阿里云 配置文件 - * - * @author yanxiaojian - * @date 2021-06-10 - **/ -@Data -@EqualsAndHashCode(callSuper = false) -@Component -@ConfigurationProperties(prefix = AliYunSmsProperties.PROP_PREFIX) -public class AliYunSmsProperties { - - public static final String PROP_PREFIX = "sms.aliyun"; - - /** 主账号id */ - private String accessKeyId; - - /** 密钥 */ - private String accessKeySecret; - -} diff --git a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/model/SmsModel.java b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/model/SmsModel.java index 3ffe610e..2ecde949 100644 --- a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/model/SmsModel.java +++ b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/model/SmsModel.java @@ -38,6 +38,12 @@ public class SmsModel implements Serializable { private static final long serialVersionUID = 1L; + /** access_key */ + private String accessKey; + + /** access_key_secret */ + private String accessKeySecret; + /** 手机号集合 */ List tels; diff --git a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/msg/SmsMsgCodeEnum.java b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/msg/SmsMsgCodeEnum.java index f294f279..bbdd0e18 100644 --- a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/msg/SmsMsgCodeEnum.java +++ b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/msg/SmsMsgCodeEnum.java @@ -44,6 +44,8 @@ public enum SmsMsgCodeEnum implements BaseMsg { CODE_ERROR_SMS_TEMPLATE_CODE_NULL(310002, "模版编号不可为空"), CODE_ERROR_SMS_TEMPLATE_PARAM_NULL(310003, "模版参数不可为空"), CODE_ERROR_SMS_PHONE_NUMBERS_NULL(310004, "手机号不可为空"), + CODE_ERROR_SMS_ACCESS_KEY_NULL(310001, "ACCESS_KEY 不可为空"), + CODE_ERROR_SMS_ACCESS_KEY_SECRET_NULL(310001, "ACCESS_KEY_SECRET 不可为空"), CODE_ERROR_SMS_INIT(310010, "初始化参数异常"), EXCEPTION_IS_PHONE(98010,"不是座机号码+手机号码(CharUtil中国)+ 400 + 800电话 + 手机号号码(香港)! "), diff --git a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/service/impl/AliYunSmsServiceImpl.java b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/service/impl/AliYunSmsServiceImpl.java index 7c38fef5..6e338e89 100644 --- a/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/service/impl/AliYunSmsServiceImpl.java +++ b/opsli-plugins/opsli-plugins-sms/src/main/java/org/opsli/plugins/sms/service/impl/AliYunSmsServiceImpl.java @@ -21,13 +21,11 @@ import cn.hutool.core.util.StrUtil; import cn.javaer.aliyun.sms.SmsClient; import cn.javaer.aliyun.sms.SmsTemplate; import lombok.extern.slf4j.Slf4j; -import org.opsli.plugins.sms.conf.AliYunSmsProperties; import org.opsli.plugins.sms.enums.SmsType; import org.opsli.plugins.sms.exceptions.SmsException; import org.opsli.plugins.sms.model.SmsModel; import org.opsli.plugins.sms.msg.SmsMsgCodeEnum; import org.opsli.plugins.sms.service.SmsService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -43,8 +41,6 @@ import java.util.Map; @Service public class AliYunSmsServiceImpl implements SmsService { - @Autowired - private AliYunSmsProperties aliyunSmsProperties; @Override public SmsType getType() { @@ -54,28 +50,23 @@ public class AliYunSmsServiceImpl implements SmsService { @Override public void sendSms(SmsModel smsModel) { // 发送短信 - this.sendSms(smsModel.getSignName(), smsModel.getTemplateCode(), smsModel.getTemplateParam(), + this.sendSms(smsModel.getAccessKey(), smsModel.getAccessKeySecret(), smsModel.getSignName(), smsModel.getTemplateCode(), smsModel.getTemplateParam(), smsModel.getTels()); } /** * 发送信息 + * @param accessKey accessKey + * @param accessKeySecret accessKeySecret * @param templateCode SMS_153055065 * @param templateParam {"code":"1111"} * @param phoneNumbers 支持对多个手机号码发送短信,手机号码之间以英文逗号(,)分隔。上限为1000个手机号码 */ - private void sendSms(String signName, String templateCode, Map templateParam, List phoneNumbers){ + private void sendSms(String accessKey, String accessKeySecret, String signName, String templateCode, Map templateParam, List phoneNumbers){ // 验证参数 - verify(signName, templateCode, templateParam, phoneNumbers); + verify(accessKey, accessKeySecret, signName, templateCode, templateParam, phoneNumbers); - if(StrUtil.isEmpty(aliyunSmsProperties.getAccessKeyId()) || - StrUtil.isEmpty(aliyunSmsProperties.getAccessKeySecret())){ - // 初始化参数异常 - throw new SmsException(SmsMsgCodeEnum.CODE_ERROR_SMS_INIT); - } - - SmsClient smsClient = new SmsClient(aliyunSmsProperties.getAccessKeyId(), - aliyunSmsProperties.getAccessKeySecret()); + SmsClient smsClient = new SmsClient(accessKey, accessKeySecret); // 发送信息 SmsTemplate smsTemplate = SmsTemplate.builder() @@ -94,7 +85,24 @@ public class AliYunSmsServiceImpl implements SmsService { * @param templateParam 模版参数 * @param phoneNumbers 手机号 */ - private void verify(String signName, String templateCode, Map templateParam, List phoneNumbers){ + private void verify( + String accessKey, String accessKeySecret, + String signName, String templateCode, + Map templateParam, List phoneNumbers){ + + if(StrUtil.isEmpty(accessKey)){ + // accessKey不可为空 + throw new SmsException(SmsMsgCodeEnum.CODE_ERROR_SMS_ACCESS_KEY_NULL); + } + if(StrUtil.isEmpty(accessKeySecret)){ + // accessKeySecret不可为空 + throw new SmsException(SmsMsgCodeEnum.CODE_ERROR_SMS_ACCESS_KEY_SECRET_NULL); + } + if(StrUtil.isEmpty(signName)){ + // 签名不可为空 + throw new SmsException(SmsMsgCodeEnum.CODE_ERROR_SMS_SIG_NAME_NULL); + } + if(StrUtil.isEmpty(signName)){ // 签名不可为空 throw new SmsException(SmsMsgCodeEnum.CODE_ERROR_SMS_SIG_NAME_NULL);