优化配置类

v1.4.1
Parker 5 years ago
parent f861bbae2e
commit 981e679163

@ -13,9 +13,8 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.api.conf.prop;
package org.opsli.core.autoconfigure;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ -25,9 +24,16 @@ import org.springframework.stereotype.Component;
*/
@Component
@ConfigurationProperties(prefix = "server.servlet.api.path")
@Data
public class ApiPathProperties {
String globalPrefix = "api";
/** 专门针对 Controller层接口路径前缀全局配置 */
private String globalPrefix;
public String getGlobalPrefix() {
return globalPrefix;
}
public void setGlobalPrefix(String globalPrefix) {
this.globalPrefix = globalPrefix;
}
}

@ -0,0 +1,359 @@
package org.opsli.core.autoconfigure;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Set;
/**
* OPSLI
*
* @author
* @date 2021-01-31 5:52
**/
@Configuration
@ConfigurationProperties(prefix = GlobalProperties.PREFIX)
public class GlobalProperties {
public static final String PREFIX = "opsli";
/** 系统名称 */
private String systemName;
/** 系统启动时间 为空则默认 真实当前系统启动时间 */
private String systemStarterTime;
/** 是否开启演示模式 */
private boolean enableDemo;
/** 软防火墙 */
private Waf waf;
/** 认证类 */
private Auth auth;
/** Web类 */
private Web web;
/** Excel类 */
private Excel excel;
// ==================================
public String getSystemName() {
return systemName;
}
public void setSystemName(String systemName) {
this.systemName = systemName;
}
public String getSystemStarterTime() {
return systemStarterTime;
}
public void setSystemStarterTime(String systemStarterTime) {
this.systemStarterTime = systemStarterTime;
}
public boolean isEnableDemo() {
return enableDemo;
}
public void setEnableDemo(boolean enableDemo) {
this.enableDemo = enableDemo;
}
public Waf getWaf() {
return waf;
}
public void setWaf(Waf waf) {
this.waf = waf;
}
public Auth getAuth() {
return auth;
}
public void setAuth(Auth auth) {
this.auth = auth;
}
public Web getWeb() {
return web;
}
public void setWeb(Web web) {
this.web = web;
}
public Excel getExcel() {
return excel;
}
public void setExcel(Excel excel) {
this.excel = excel;
}
// ============== 内部类 =============
/**
*
*/
public static class Waf {
/** 是否生效 */
private boolean enable;
/** xss 过滤 */
private boolean xssFilter;
/** sql 过滤 */
private boolean sqlFilter;
/** 过滤器需要过滤的路径 */
private Set<String> urlPatterns;
/** 过滤器需要排除过滤的路径 */
private Set<String> urlExclusion;
/** 过滤器的优先级,值越小优先级越高 */
private int order;
// =============================
public Set<String> getUrlPatterns() {
return urlPatterns;
}
public void setUrlPatterns(Set<String> urlPatterns) {
this.urlPatterns = urlPatterns;
}
public Set<String> getUrlExclusion() {
return urlExclusion;
}
public void setUrlExclusion(Set<String> urlExclusion) {
this.urlExclusion = urlExclusion;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
public boolean isXssFilter() {
return xssFilter;
}
public void setXssFilter(boolean xssFilter) {
this.xssFilter = xssFilter;
}
public boolean isSqlFilter() {
return sqlFilter;
}
public void setSqlFilter(boolean sqlFilter) {
this.sqlFilter = sqlFilter;
}
}
/**
* Web
*/
public static class Web {
/** 文件上传地址 */
private String uploadPath;
// ===========================
public String getUploadPath() {
return uploadPath;
}
public void setUploadPath(String uploadPath) {
this.uploadPath = uploadPath;
}
}
/**
*
*/
public static class Auth {
/** 超级管理员账号 */
private String superAdmin;
/** 默认密码 */
private String defaultPass;
/** Token */
private Token token;
/** Login */
private Login login;
// ===========================
public String getSuperAdmin() {
return superAdmin;
}
public void setSuperAdmin(String superAdmin) {
this.superAdmin = superAdmin;
}
public String getDefaultPass() {
return defaultPass;
}
public void setDefaultPass(String defaultPass) {
this.defaultPass = defaultPass;
}
public Token getToken() {
return token;
}
public void setToken(Token token) {
this.token = token;
}
public Login getLogin() {
return login;
}
public void setLogin(Login login) {
this.login = login;
}
/**
*
*/
public static class Token {
/** 盐值 */
private String secret;
/** 有效时间 (分钟)*/
private Integer effectiveTime;
/** 排除URL*/
private Set<String> urlExclusion;
// ===============================
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public Integer getEffectiveTime() {
return effectiveTime;
}
public void setEffectiveTime(Integer effectiveTime) {
this.effectiveTime = effectiveTime;
}
public Set<String> getUrlExclusion() {
return urlExclusion;
}
public void setUrlExclusion(Set<String> urlExclusion) {
this.urlExclusion = urlExclusion;
}
}
/**
*
*/
public static class Login {
/** 失败次数 */
private Integer slipCount;
/** 失败N次后弹出验证码 (超过验证码阈值 弹出验证码) */
private Integer slipVerifyCount;
/** 失败锁定时间(秒) */
private Integer slipLockSpeed;
public Integer getSlipCount() {
return slipCount;
}
public void setSlipCount(Integer slipCount) {
this.slipCount = slipCount;
}
public Integer getSlipVerifyCount() {
return slipVerifyCount;
}
public void setSlipVerifyCount(Integer slipVerifyCount) {
this.slipVerifyCount = slipVerifyCount;
}
public Integer getSlipLockSpeed() {
return slipLockSpeed;
}
public void setSlipLockSpeed(Integer slipLockSpeed) {
this.slipLockSpeed = slipLockSpeed;
}
}
}
/**
* Excel
*/
public static class Excel {
/** 最大导入操作数 */
private Integer importMaxCount;
/** 最大导出操作数 */
private Integer exportMaxCount;
// ===========================
public Integer getImportMaxCount() {
return importMaxCount;
}
public void setImportMaxCount(Integer importMaxCount) {
this.importMaxCount = importMaxCount;
}
public Integer getExportMaxCount() {
return exportMaxCount;
}
public void setExportMaxCount(Integer exportMaxCount) {
this.exportMaxCount = exportMaxCount;
}
}
}

@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.core.base.concroller;
package org.opsli.core.base.controller;
import cn.hutool.core.collection.CollUtil;
@ -37,6 +37,7 @@ import org.opsli.common.exception.TokenException;
import org.opsli.common.msg.CommonMsg;
import org.opsli.common.utils.OutputStreamUtil;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.autoconfigure.GlobalProperties;
import org.opsli.core.base.entity.BaseEntity;
import org.opsli.core.base.service.interfaces.CrudServiceInterface;
import org.opsli.core.cache.local.CacheUtil;
@ -49,7 +50,6 @@ import org.opsli.plugins.excel.exception.ExcelPluginException;
import org.opsli.plugins.redis.RedisLockPlugins;
import org.opsli.plugins.redis.lock.RedisLock;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@ -77,9 +77,6 @@ import java.util.List;
@RestController
public abstract class BaseRestController <T extends BaseEntity, E extends ApiWrapper, S extends CrudServiceInterface<T,E>>{
@Value("${opsli.enable-demo}")
private boolean enableDemo;
/** 开启热点数据状态 */
protected boolean hotDataFlag = false;
@ -92,14 +89,19 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
/** Model 泛型游标 */
private static final int MODEL_INDEX = 1;
/** Excel 最大操作数量 防止OOM */
@Value("${opsli.excel-max-count:20000}")
private Integer excelMaxCount;
/** 配置类 */
@Autowired
protected GlobalProperties globalProperties;
/** 子类Service */
@Autowired(required = false)
protected S IService;
/** Redis分布式锁 */
@Autowired
private RedisLockPlugins redisLockPlugins;
/** Excel工具类 */
@Autowired
private ExcelUtil excelUtil;
@ -107,8 +109,8 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
*
* id
*
* @param id
* @return
* @param id id
* @return E
*/
@ModelAttribute
public E get(@RequestParam(required=false) String id) {
@ -191,8 +193,8 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
/**
* Excel
* @param request
* @return
* @param request request
* @return ResultVo
*/
protected ResultVo<?> importExcel(MultipartHttpServletRequest request){
// 计时器
@ -210,8 +212,9 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
try {
List<E> modelList = excelUtil.readExcel(files.get(0), modelClazz);
if(CollUtil.isNotEmpty(modelList)){
if(modelList.size() > excelMaxCount){
String maxError = StrUtil.format(CoreMsg.EXCEL_HANDLE_MAX.getMessage(), modelList.size(), excelMaxCount);
if(modelList.size() > globalProperties.getExcel().getImportMaxCount()){
String maxError = StrUtil.format(CoreMsg.EXCEL_HANDLE_MAX.getMessage(), modelList.size(),
globalProperties.getExcel().getImportMaxCount());
// 清空 list
modelList.clear();
// 超出最大导出数量
@ -253,7 +256,7 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
/**
*
* @param fileName
* @param response
* @param response response
*/
protected void importTemplate(String fileName, HttpServletResponse response, Method method){
this.excelExport(fileName + " 模版 ",null, response, method);
@ -306,8 +309,9 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
if(queryWrapper != null){
// 获得数量 大于 阈值 禁止导出, 防止OOM
int count = IService.count(queryWrapper);
if(count > excelMaxCount){
String maxError = StrUtil.format(CoreMsg.EXCEL_HANDLE_MAX.getMessage(), count, excelMaxCount);
if(count > globalProperties.getExcel().getExportMaxCount()){
String maxError = StrUtil.format(CoreMsg.EXCEL_HANDLE_MAX.getMessage(), count,
globalProperties.getExcel().getExportMaxCount());
// 超出最大导出数量
throw new ExcelPluginException(CoreMsg.EXCEL_HANDLE_MAX.getCode(), maxError);
}
@ -353,7 +357,8 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
protected void demoError(){
UserModel user = UserUtil.getUser();
// 演示模式 不允许操作 (超级管理员可以操作)
if(enableDemo && !UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(globalProperties.isEnableDemo() &&
!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(CoreMsg.EXCEPTION_ENABLE_DEMO);
}
}
@ -382,7 +387,7 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
/**
*
* @return
* @return E
*/
private E createModel() {
try {
@ -397,7 +402,7 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
/**
* Clazz
* @return
* @return Class<E>
*/
private Class<E> getModelClass(){
Class<E> tClass = null;
@ -410,7 +415,7 @@ public abstract class BaseRestController <T extends BaseEntity, E extends ApiWra
/**
* Clazz
* @return
* @return Class<T>
*/
private Class<T> getEntityClass(){
Class<T> tClass = null;

@ -30,11 +30,13 @@ import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.opsli.common.utils.Props;
import org.opsli.core.autoconfigure.GlobalProperties;
import org.opsli.core.security.shiro.authenticator.CustomModularRealmAuthenticator;
import org.opsli.core.security.shiro.filter.CustomShiroFilter;
import org.opsli.core.security.shiro.realm.FlagRealm;
import org.opsli.plugins.redis.conf.RedisPluginConfig;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -69,6 +71,9 @@ public class ShiroConfig {
API_URL_PREFIX = props.getStr("server.servlet.api.path.global-prefix","");
}
@Autowired
GlobalProperties globalProperties;
/**
* filer
* @param securityManager

@ -13,12 +13,11 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.api.conf;
package org.opsli.core.conf;
import lombok.extern.slf4j.Slf4j;
import org.opsli.api.conf.prop.ApiPathProperties;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.utils.Props;
import org.opsli.core.autoconfigure.ApiPathProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
@ -37,14 +36,6 @@ import javax.annotation.Resource;
@Configuration
public class SpringWebMvcConfig implements WebMvcConfigurer {
/** 虚拟根路径 */
private static final String BASE_DIR;
static {
Props props = new Props("application.yaml");
BASE_DIR = props.getStr("server.tomcat.basedir");
}
@Resource
private ApiPathProperties apiPathProperties;

@ -15,11 +15,11 @@
*/
package org.opsli.core.conf;
import org.opsli.core.waf.WafProperties;
import cn.hutool.core.convert.Convert;
import org.opsli.core.autoconfigure.GlobalProperties;
import org.opsli.core.waf.filter.WafFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -34,26 +34,25 @@ import javax.servlet.DispatcherType;
* @date 2020-10-09
*/
@Configuration
@EnableConfigurationProperties({WafProperties.class})
public class WafConfig {
@Autowired
WafProperties wafProperties;
GlobalProperties globalProperties;
@Bean
@ConditionalOnProperty(prefix = WafProperties.WAF, name = "enable", havingValue = "true", matchIfMissing = false)
public FilterRegistrationBean xssFilterRegistration() {
@ConditionalOnProperty(prefix = GlobalProperties.PREFIX +".waf", name = "enable", havingValue = "true", matchIfMissing = false)
public FilterRegistrationBean<WafFilter> wafFilterRegistration() {
WafFilter wafFilter = new WafFilter();
wafFilter.setUrlExclusion(wafProperties.getUrlExclusion());
wafFilter.setEnableSqlFilter(wafProperties.isSqlFilter());
wafFilter.setEnableXssFilter(wafProperties.isXssFilter());
wafFilter.setUrlExclusion(globalProperties.getWaf().getUrlExclusion());
wafFilter.setEnableSqlFilter(globalProperties.getWaf().isSqlFilter());
wafFilter.setEnableXssFilter(globalProperties.getWaf().isXssFilter());
FilterRegistrationBean registration = new FilterRegistrationBean();
FilterRegistrationBean<WafFilter> registration = new FilterRegistrationBean<>();
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setFilter(wafFilter);
registration.addUrlPatterns(wafProperties.getUrlPatterns());
registration.setName(wafProperties.getName());
registration.setOrder(wafProperties.getOrder());
registration.addUrlPatterns(Convert.toStrArray(globalProperties.getWaf().getUrlPatterns()));
registration.setName(WafFilter.class.getSimpleName());
registration.setOrder(globalProperties.getWaf().getOrder());
return registration;
}

@ -21,7 +21,7 @@ import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.opsli.api.base.warpper.ApiWrapper;
import org.opsli.api.utils.ValidationUtil;
import org.opsli.core.utils.ValidationUtil;
import org.opsli.common.exception.ServiceException;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.api.msg;
package org.opsli.core.msg;
import org.opsli.common.base.msg.BaseMsg;

@ -20,10 +20,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.wrapper.system.user.UserModel;
import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.exception.ServiceException;
import org.opsli.common.utils.HumpUtil;
import org.opsli.core.base.entity.BaseEntity;
import org.opsli.core.msg.CoreMsg;
import org.opsli.core.utils.UserUtil;
/**

@ -8,38 +8,43 @@ import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.opsli.core.autoconfigure.GlobalProperties;
import org.opsli.common.constants.SignConstants;
import org.opsli.common.constants.TokenTypeConstants;
import org.opsli.common.exception.JwtException;
import org.opsli.common.utils.Props;
import org.opsli.core.msg.JwtMsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Date;
import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
/**
* JWT
* @author sunzhiqiang23
* @date 2020/05/29 21:23
*/
@Slf4j
public final class JwtUtil {
@Order(UTIL_ORDER)
@Lazy(false)
@Component
@AutoConfigureAfter({GlobalProperties.class})
public class JwtUtil {
/**
* 120
*/
public static final long EXPIRE;
public static long EXPIRE;
/**
* JWT(Base64)
*/
private static final String ENCRYPT_JWT_KEY = "a30ade6452725123436288ccae58570738ee";
static {
Props props = new Props("application.yaml");
// token 有效时间
EXPIRE = props.getLong("opsli.token-effective-time", 120L) * 60 * 1000;
}
private static String ENCRYPT_JWT_INITIAL_SECRET;
/**
@ -48,7 +53,7 @@ public final class JwtUtil {
* @return boolean
*/
public static boolean verify(String token) {
String secret = getClaim(token, SignConstants.ACCOUNT) + Base64.decodeStr(ENCRYPT_JWT_KEY);
String secret = getClaim(token, SignConstants.ACCOUNT) + Base64.decodeStr(ENCRYPT_JWT_INITIAL_SECRET);
Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm).build();
verifier.verify(token);
@ -57,8 +62,8 @@ public final class JwtUtil {
/**
* Token
* @param token
* @param claim
* @param token token
* @param claim
* @return java.lang.String
*/
public static String getClaim(String token, String claim) {
@ -81,7 +86,7 @@ public final class JwtUtil {
*/
public static String sign(String tokenType, String account, String userId) {
// 帐号加JWT私钥加密
String secret = account + Base64.decodeStr(ENCRYPT_JWT_KEY);
String secret = account + Base64.decodeStr(ENCRYPT_JWT_INITIAL_SECRET);
// 此处过期时间是以毫秒为单位所以乘以1000
Date date = new Date(System.currentTimeMillis() + EXPIRE);
Algorithm algorithm = Algorithm.HMAC256(secret);
@ -97,15 +102,37 @@ public final class JwtUtil {
}
public static void main(String[] args) {
String aaaaaa = JwtUtil.sign(TokenTypeConstants.TYPE_SYSTEM, "aaaaaa","123123");
// ==================
boolean verify = JwtUtil.verify(aaaaaa);
System.out.println(aaaaaa);
System.out.println(verify);
@Autowired
public void setExpire(GlobalProperties globalProperties) {
// 获得 Token失效时间
if(globalProperties != null && globalProperties.getAuth() != null
&& globalProperties.getAuth().getToken() != null
){
EXPIRE = globalProperties.getAuth()
.getToken().getEffectiveTime() * 60 * 1000;
}
}
@Autowired
public void setEncryptJwtInitialSecret(GlobalProperties globalProperties) {
// 获得 Token初始盐值
if(globalProperties != null && globalProperties.getAuth() != null
&& globalProperties.getAuth().getToken() != null
){
ENCRYPT_JWT_INITIAL_SECRET = globalProperties.getAuth()
.getToken().getSecret();
}
}
// ==================
private JwtUtil(){}
public static void main(String[] args) {
String token = JwtUtil.sign(TokenTypeConstants.TYPE_SYSTEM, "test","123123");
boolean verify = JwtUtil.verify(token);
System.out.println(token);
System.out.println(verify);
}
}

@ -32,6 +32,7 @@ import org.opsli.common.constants.TokenConstants;
import org.opsli.common.constants.TokenTypeConstants;
import org.opsli.common.exception.TokenException;
import org.opsli.common.utils.Props;
import org.opsli.core.autoconfigure.GlobalProperties;
import org.opsli.core.msg.TokenMsg;
import org.opsli.plugins.redis.RedisPlugin;
import org.springframework.beans.factory.annotation.Autowired;
@ -55,7 +56,7 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
@Slf4j
@Order(UTIL_ORDER)
@Component
@AutoConfigureAfter({RedisPlugin.class})
@AutoConfigureAfter({GlobalProperties.class, RedisPlugin.class})
@Lazy(false)
public class UserTokenUtil {
@ -68,11 +69,11 @@ public class UserTokenUtil {
/** 账号失败锁定KEY */
public static final String ACCOUNT_SLIP_LOCK_PREFIX;
/** 账号失败阈值 */
public static final int ACCOUNT_SLIP_COUNT;
public static int ACCOUNT_SLIP_COUNT;
/** 账号失败N次后弹出验证码 */
public static final int ACCOUNT_SLIP_VERIFY_COUNT;
public static int ACCOUNT_SLIP_VERIFY_COUNT;
/** 账号锁定时间 */
public static final int ACCOUNT_SLIP_LOCK_SPEED;
public static int ACCOUNT_SLIP_LOCK_SPEED;
/** Redis插件 */
private static RedisPlugin redisPlugin;
@ -88,16 +89,13 @@ public class UserTokenUtil {
ACCOUNT_SLIP_COUNT_PREFIX = PREFIX_NAME + "account:slip:count:";
ACCOUNT_SLIP_LOCK_PREFIX = PREFIX_NAME + "account:slip:lock:";
// 配置数据
ACCOUNT_SLIP_COUNT = props.getInt("opsli.login.slip-count", 5);
ACCOUNT_SLIP_VERIFY_COUNT = props.getInt("opsli.login.slip-verify-count", 3);
ACCOUNT_SLIP_LOCK_SPEED = props.getInt("opsli.login.slip-lock-speed", 300);
}
/**
* user Token
* @param user
* @param user
* @return
*/
public static ResultVo<Map<String,Object>> createToken(UserModel user) {
@ -145,7 +143,7 @@ public class UserTokenUtil {
/**
* Token ID
* @param token
* @param token token
* @return
*/
public static String getUserIdByToken(String token) {
@ -161,7 +159,7 @@ public class UserTokenUtil {
/**
* Token username
* @param token
* @param token token
* @return
*/
public static String getUserNameByToken(String token) {
@ -179,7 +177,7 @@ public class UserTokenUtil {
/**
* 退
* @param token
* @param token token
*/
public static void logout(String token) {
if(StringUtils.isEmpty(token)){
@ -206,7 +204,7 @@ public class UserTokenUtil {
/**
* token
* @param token
* @param token token
*/
public static boolean verify(String token) {
if(StringUtils.isEmpty(token)){
@ -341,4 +339,33 @@ public class UserTokenUtil {
UserTokenUtil.redisPlugin = redisPlugin;
}
@Autowired
public void setAccountSlipCount(GlobalProperties globalProperties) {
if(globalProperties != null && globalProperties.getAuth() != null
&& globalProperties.getAuth().getLogin() != null
){
ACCOUNT_SLIP_COUNT = globalProperties.getAuth()
.getLogin().getSlipCount();
}
}
@Autowired
public void setAccountSlipVerifyCount(GlobalProperties globalProperties) {
if(globalProperties != null && globalProperties.getAuth() != null
&& globalProperties.getAuth().getLogin() != null
){
ACCOUNT_SLIP_VERIFY_COUNT = globalProperties.getAuth()
.getLogin().getSlipVerifyCount();
}
}
@Autowired
public void setAccountSlipLockSpeed(GlobalProperties globalProperties) {
if(globalProperties != null && globalProperties.getAuth() != null
&& globalProperties.getAuth().getLogin() != null
){
ACCOUNT_SLIP_LOCK_SPEED = globalProperties.getAuth()
.getLogin().getSlipLockSpeed();
}
}
}

@ -28,7 +28,7 @@ import org.opsli.api.wrapper.system.menu.MenuModel;
import org.opsli.api.wrapper.system.user.UserModel;
import org.opsli.common.api.TokenThreadLocal;
import org.opsli.common.exception.TokenException;
import org.opsli.common.utils.Props;
import org.opsli.core.autoconfigure.GlobalProperties;
import org.opsli.core.cache.local.CacheUtil;
import org.opsli.core.cache.pushsub.msgs.UserMsgFactory;
import org.opsli.core.msg.TokenMsg;
@ -55,13 +55,10 @@ import static org.opsli.common.constants.OrderConstants.UTIL_ORDER;
@Slf4j
@Order(UTIL_ORDER)
@Component
@AutoConfigureAfter({RedisPlugin.class , RedisLockPlugins.class, UserApi.class})
@AutoConfigureAfter({GlobalProperties.class, RedisPlugin.class , RedisLockPlugins.class, UserApi.class})
@Lazy(false)
public class UserUtil {
/** 超级管理员 */
public static final String SUPER_ADMIN;
/** 前缀 */
public static final String PREFIX_ID = "userId:";
public static final String PREFIX_ID_ROLES = "userId:roles:";
@ -79,15 +76,12 @@ public class UserUtil {
/** 用户Service */
private static UserApi userApi;
static{
Props props = new Props("application.yaml");
SUPER_ADMIN = props.getStr("opsli.superadmin","system");
}
/** 超级管理员 */
public static String SUPER_ADMIN;
/**
*
* @return
* @return UserModel
*/
public static UserModel getUser(){
String token = TokenThreadLocal.get();
@ -108,8 +102,8 @@ public class UserUtil {
/**
* ID
* @param userId
* @return
* @param userId ID
* @return UserModel
*/
public static UserModel getUser(String userId){
// 先从缓存里拿
@ -176,8 +170,8 @@ public class UserUtil {
/**
* userName
* @param userName
* @return
* @param userName
* @return UserModel
*/
public static UserModel getUserByUserName(String userName){
// 先从缓存里拿
@ -238,8 +232,8 @@ public class UserUtil {
/**
* userId
* @param userId
* @return
* @param userId ID
* @return List
*/
public static List<String> getUserRolesByUserId(String userId){
List<String> roles = null;
@ -325,8 +319,8 @@ public class UserUtil {
/**
* userId
* @param userId
* @return
* @param userId ID
* @return List
*/
public static List<String> getUserAllPermsByUserId(String userId){
List<String> permissions = null;
@ -412,8 +406,8 @@ public class UserUtil {
/**
* userId
* @param userId
* @return
* @param userId ID
* @return List
*/
public static List<MenuModel> getMenuListByUserId(String userId){
List<MenuModel> menus = null;
@ -521,8 +515,8 @@ public class UserUtil {
/**
* -
* @param user
* @return
* @param user
* @return boolean
*/
public static boolean refreshUser(UserModel user){
if(user == null || StringUtils.isEmpty(user.getId())){
@ -587,8 +581,8 @@ public class UserUtil {
/**
* -
* @param userId
* @return
* @param userId ID
* @return boolean
*/
public static boolean refreshUserRoles(String userId){
Object obj = CacheUtil.get(PREFIX_ID_ROLES + userId);
@ -626,8 +620,8 @@ public class UserUtil {
/**
* -
* @param userId
* @return
* @param userId ID
* @return boolean
*/
public static boolean refreshUserAllPerms(String userId){
Object obj = CacheUtil.get(PREFIX_ID_PERMISSIONS + userId);
@ -665,8 +659,8 @@ public class UserUtil {
/**
* -
* @param userId
* @return
* @param userId ID
* @return boolean
*/
public static boolean refreshUserMenus(String userId){
Object obj = CacheUtil.get(PREFIX_ID_MENUS + userId);
@ -704,7 +698,7 @@ public class UserUtil {
/**
* ID
* @return
* @return String
*/
public static String getTenantId(){
// 判断权限 如果是 admin 超级管理员 则租户ID清空 且findList 不做处理 否则默认都会做处理
@ -713,7 +707,7 @@ public class UserUtil {
UserModel user = getUser();
// 如果是超级管理员 则不进行租户处理
if(SUPER_ADMIN.equals(user.getUsername())){
if(StringUtils.equals(SUPER_ADMIN, user.getUsername())){
return null;
}
return user.getTenantId();
@ -723,7 +717,7 @@ public class UserUtil {
*
* @param password
* @param secretkey
* @return
* @return String
*/
public static String handlePassword(String password, String secretkey){
return new Md5Hash(password, secretkey).toHex();
@ -745,4 +739,13 @@ public class UserUtil {
public void setUserApi(UserApi userApi) {
UserUtil.userApi = userApi;
}
@Autowired
public void setSuperAdmin(GlobalProperties globalProperties) {
// 获得 超级管理员
if(globalProperties != null && globalProperties.getAuth() != null ){
UserUtil.SUPER_ADMIN = globalProperties.getAuth().getSuperAdmin();
}
}
}

@ -13,7 +13,7 @@
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.opsli.api.utils;
package org.opsli.core.utils;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.lang.Validator;
@ -21,7 +21,7 @@ import cn.hutool.core.util.ReflectUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.msg.ValidationMsg;
import org.opsli.core.msg.ValidationMsg;
import org.opsli.api.wrapper.system.dict.DictModel;
import org.opsli.common.annotation.validation.ValidationArgs;
import org.opsli.common.annotation.validation.ValidationArgsLenMax;

@ -1,119 +0,0 @@
/**
* Copyright 2020 OPSLI https://www.opsli.com
* <p>
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.waf;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
/**
* Xss
*
* @author Parker
* @date 2018/10/26
*/
@ConfigurationProperties(prefix = WafProperties.WAF)
public class WafProperties {
public static final String WAF = "opsli.waf";
/**
*
*/
boolean enable = false;
/**
* xss
*/
boolean xssFilter = false;
/**
* sql
*/
boolean sqlFilter = false;
/**
* xss
*/
String name = "xssFilter";
/**
* xss
*/
String[] urlPatterns = {"/*"};
List<String> urlExclusion;
/**
*
*/
int order = 0;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String[] getUrlPatterns() {
return urlPatterns;
}
public void setUrlPatterns(String[] urlPatterns) {
this.urlPatterns = urlPatterns;
}
public List<String> getUrlExclusion() {
return urlExclusion;
}
public void setUrlExclusion(List<String> urlExclusion) {
this.urlExclusion = urlExclusion;
}
public int getOrder() {
return order;
}
public void setOrder(int order) {
this.order = order;
}
public boolean isEnable() {
return enable;
}
public void setEnable(boolean enable) {
this.enable = enable;
}
public boolean isXssFilter() {
return xssFilter;
}
public void setXssFilter(boolean xssFilter) {
this.xssFilter = xssFilter;
}
public boolean isSqlFilter() {
return sqlFilter;
}
public void setSqlFilter(boolean sqlFilter) {
this.sqlFilter = sqlFilter;
}
}

@ -22,6 +22,7 @@ import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.Set;
/**
*
@ -34,7 +35,7 @@ public class WafFilter implements Filter {
private boolean enableXssFilter = false;
private boolean enableSqlFilter = false;
private List<String> urlExclusion;
private Set<String> urlExclusion;
@Override
@ -74,7 +75,7 @@ public class WafFilter implements Filter {
this.enableSqlFilter = enableSqlFilter;
}
public void setUrlExclusion(List<String> urlExclusion) {
public void setUrlExclusion(Set<String> urlExclusion) {
this.urlExclusion = urlExclusion;
}
}

@ -0,0 +1,194 @@
{
"properties": [
{
"name": "server.servlet.api.path.global-prefix",
"type": "java.lang.String",
"defaultValue": "api",
"description": "专门针对 Controller层接口路径前缀全局配置."
},
{
"name": "spring.cache-conf.prefix",
"type": "java.lang.String",
"defaultValue": "opsli",
"description": "缓存配置项 前缀."
},
{
"name": "spring.cache.enable",
"type": "java.lang.Boolean",
"defaultValue": false,
"description": "是否启用本地缓存 (默认不启用, 如果业务对于缓存依赖较高可启用本地缓存作为一级缓存)."
},
{
"name": "spring.redis.pushsub.enable",
"type": "java.lang.Boolean",
"defaultValue": false,
"description": "开启消息订阅."
},
{
"name": "knife4j.basic.enable",
"type": "java.lang.Boolean",
"defaultValue": false,
"description": "knife4j 开启Swagger的Basic认证功能,默认是false."
},
{
"name": "knife4j.basic.username",
"type": "java.lang.String",
"defaultValue": "admin",
"description": "knife4j Basic认证用户名."
},
{
"name": "knife4j.basic.password",
"type": "java.lang.String",
"defaultValue": "123456",
"description": "knife4j Basic认证密码."
},
{
"name": "knife4j.production",
"type": "java.lang.Boolean",
"defaultValue": true,
"description": "knife4j 是否生产环境 (生产环境默认屏蔽文档)."
},
{
"name": "log.path",
"type": "java.lang.String",
"defaultValue": "",
"description": "日志存储地址."
},
{
"name": "opsli.system-name",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties",
"defaultValue": "OPSLI 快速开发平台",
"description": "系统名称."
},
{
"name": "opsli.system-starter-time",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties",
"description": "系统启动时间 为空则默认 真实当前系统启动时间."
},
{
"name": "opsli.enable-demo",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties",
"defaultValue": false,
"description": "是否开启演示模式."
},
{
"name": "opsli.waf.enable",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Waf",
"defaultValue": false,
"description": "软防火墙是否开启."
},
{
"name": "opsli.waf.xss-filter",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Waf",
"defaultValue": false,
"description": "软防火墙 xss 过滤开启状态."
},
{
"name": "opsli.waf.sql-filter",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Waf",
"defaultValue": false,
"description": "软防火墙 sql 过滤开启状态."
},
{
"name": "opsli.waf.url-patterns",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Waf",
"defaultValue": [
"/*"
],
"description": "软防火墙 过滤器需要过滤的路径."
},
{
"name": "opsli.waf.url-exclusion",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Waf",
"description": "软防火墙 过滤器需要排除过滤的路径."
},
{
"name": "opsli.waf.order",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Waf",
"defaultValue": 0,
"description": "软防火墙 过滤器的优先级,值越小优先级越高."
},
{
"name": "opsli.web.upload-path",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Web",
"defaultValue": "",
"description": "Web 上传地址."
},
{
"name": "opsli.auth.super-admin",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth",
"defaultValue": "system",
"description": "认证类 超级管理员账户."
},
{
"name": "opsli.auth.default-pass",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth",
"defaultValue": "Aa123456",
"description": "认证类 默认密码 (密码至少包含大小写字母数字且不少于6位)."
},
{
"name": "opsli.auth.token.secret",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth$Token",
"defaultValue": "53c0e33c9d4c5538969abf2fcf48351d",
"description": "认证类 Token 有效时间."
},
{
"name": "opsli.auth.token.effective-time",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth$Token",
"defaultValue": 120,
"description": "认证类 Token 有效时间."
},
{
"name": "opsli.auth.token.url-exclusion",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth$Token",
"description": "认证类 Token 排除URL."
},
{
"name": "opsli.auth.login.slip-count",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth$Login",
"defaultValue": 3,
"description": "认证类 登录 失败次数."
},
{
"name": "opsli.auth.login.slip-verify-count",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth$Login",
"defaultValue": 3,
"description": "认证类 登录 失败N次后弹出验证码 (超过验证码阈值 弹出验证码)."
},
{
"name": "opsli.auth.login.slip-lock-speed",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Auth$Login",
"description": "认证类 登录 失败锁定时间(秒)."
},
{
"name": "opsli.excel.import-max-count",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Excel",
"defaultValue": 20000,
"description": "Excel 导入最大操作数."
},
{
"name": "opsli.excel.export-max-count",
"sourceType": "org.opsli.core.autoconfigure.GlobalProperties$Excel",
"defaultValue": 20000,
"description": "Excel 导出最大操作数."
}
]
}

@ -0,0 +1,26 @@
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.SM2;
import org.junit.Test;
/**
* @author
* @date 2021-01-31 5:15
**/
public class EncryptTest {
@Test
public void testEncrypt(){
SM2 sm2 = SmUtil.sm2("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJqTLKryt+SYq8oHZ/PeFR64Pq2A9qsKZmZFzU6gvkQ37JeCFCYMitxmF7AtlktSktB3dPdxHEppbfSdY1+i140eAqMZga7j4FmjIdnyW1OauiVgaimJLAEyE7uTAAPggrU9kdqgXbA8hIffm5tu6DKRq/t1NpYEO42S/IGK/yoxAgMBAAECgYEAiWu+klwm0LxKPdpHuK7/58e1MVst8PHWB6aW2AhgHxX46NlkQE92RGsfNCnTLDPFAkCxZCrTE/SXJJmn9yY2qoS26OV0PbTGajk96M8lDi9JSmWCNV1eywPecObSyvtPd5jaPtq2jkgNY/hHJjH6kV7UAFZuaSK7jxskfq7uR2ECQQDPfmGjPiMc65+LE9U7jC4LokyUi1yCgN6AY5MgF6fkxUVJD2mtl9BqRK7qE0OnsRb0NzID3PSfa7aA2I0Rlsj/AkEAvrXUBQ6hfuEwD1896qpSJUr7tLidby/3jYwSoewuydDT2duDc2ZCz4/U/1NpxSxWT10ZZi2ExsFZn/3PDylczwJARA3oijkcHSUu69eybVh51bkCswnOasNHtwZxv+niWEdXhTH38EbFxcUHNaDh5MNRiwH7dobm+M7EShg8lJNHEwJAclRdU97OkFr9zeliHCGZd4P5XAFlWHfgJ7p2nR4Teqe3qZ6Aspj2qqpmnd7qxOrsn02H4YqeU+0sBs9I56T7XwJAAg8wHrh/FAPY96mAya0bpv6zm/7bave17vs+8B+fhBEHHuvetfv8Xi/RkXL0rjE4LaTHefoUbZPNbIhNYiN0CQ==",
"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCakyyq8rfkmKvKB2fz3hUeuD6tgParCmZmRc1OoL5EN+yXghQmDIrcZhewLZZLUpLQd3T3cRxKaW30nWNfoteNHgKjGYGu4+BZoyHZ8ltTmrolYGopiSwBMhO7kwAD4IK1PZHaoF2wPISH35ubbugykav7dTaWBDuNkvyBiv8qMQIDAQAB"
);
System.out.println(sm2.getPublicKeyBase64());
System.out.println(sm2.getPrivateKeyBase64());
}
}

@ -17,7 +17,7 @@ package org.opsli.modulars.creater.column.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.opsli.api.utils.ValidationUtil;
import org.opsli.core.utils.ValidationUtil;
import org.opsli.common.exception.ServiceException;
import org.opsli.core.base.service.impl.CrudServiceImpl;
import org.opsli.core.creater.exception.CreaterException;

@ -21,33 +21,13 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.common.exception.ServiceException;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.creater.exception.CreaterException;
import org.opsli.core.creater.msg.CreaterMsg;
import org.opsli.core.creater.strategy.sync.util.SQLSyncUtil;
import org.opsli.core.msg.CoreMsg;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;
import org.opsli.modulars.creater.column.service.ITableColumnService;
import org.opsli.modulars.creater.column.wrapper.CreaterTableColumnModel;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.modulars.creater.createrlogs.api.CreaterLogsApi;
import org.opsli.modulars.creater.createrlogs.entity.CreaterLogs;
import org.opsli.modulars.creater.createrlogs.service.ICreateLogsService;
import org.opsli.modulars.creater.createrlogs.wrapper.CreaterLogsModel;
import org.opsli.modulars.creater.importable.ImportTableUtil;
import org.opsli.modulars.creater.table.api.TableApi;
import org.opsli.modulars.creater.table.entity.CreaterTable;
import org.opsli.modulars.creater.table.service.ITableService;
import org.opsli.modulars.creater.table.wrapper.CreaterTableAndColumnModel;
import org.opsli.modulars.creater.table.wrapper.CreaterTableModel;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**

@ -24,7 +24,7 @@ import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.common.exception.ServiceException;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.creater.exception.CreaterException;
import org.opsli.core.creater.msg.CreaterMsg;
import org.opsli.core.creater.strategy.sync.util.SQLSyncUtil;

@ -29,7 +29,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import #(apiPath).base.result.ResultVo;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;

@ -33,7 +33,6 @@ import com.google.common.collect.Sets;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.area.SysAreaRestApi;
@ -43,16 +42,14 @@ import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.utils.HumpUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.base.entity.HasChildren;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;
import org.opsli.core.utils.SpringContextHolder;
import org.opsli.modulars.system.area.entity.SysArea;
import org.opsli.modulars.system.area.service.ISysAreaService;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.servlet.http.HttpServletRequest;

@ -20,6 +20,7 @@ import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.dict.DictDetailApi;
@ -30,7 +31,7 @@ import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.exception.ServiceException;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
@ -129,7 +130,7 @@ public class DictDetailRestController extends BaseRestController<SysDictDetail,
if(dictDetailModel != null && LOCK_DATA.equals(dictDetailModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -157,7 +158,7 @@ public class DictDetailRestController extends BaseRestController<SysDictDetail,
if(dictDetailModel != null && LOCK_DATA.equals(dictDetailModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -189,7 +190,7 @@ public class DictDetailRestController extends BaseRestController<SysDictDetail,
// 内置数据 只有超级管理员可以修改
if(sysDictDetail != null && LOCK_DATA.equals(sysDictDetail.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}

@ -20,6 +20,7 @@ import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.dict.DictApi;
@ -29,10 +30,9 @@ import org.opsli.api.wrapper.system.user.UserModel;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.api.TokenThreadLocal;
import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.exception.ServiceException;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
@ -131,7 +131,7 @@ public class DictRestController extends BaseRestController<SysDict, DictModel, I
if(dictModel != null && LOCK_DATA.equals(dictModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -159,7 +159,7 @@ public class DictRestController extends BaseRestController<SysDict, DictModel, I
if(dictModel != null && LOCK_DATA.equals(dictModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -191,7 +191,7 @@ public class DictRestController extends BaseRestController<SysDict, DictModel, I
// 内置数据 只有超级管理员可以修改
if(sysDict != null && LOCK_DATA.equals(sysDict.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}

@ -21,7 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.utils.ValidationUtil;
import org.opsli.core.utils.ValidationUtil;
import org.opsli.api.wrapper.system.tenant.TenantModel;
import org.opsli.api.wrapper.system.user.UserModel;
import org.opsli.common.annotation.InterfaceEncryptAndDecrypt;
@ -116,7 +116,7 @@ public class LoginRestController {
}
// 如果不是超级管理员 需要验证租户是否生效
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
TenantModel tenant = TenantUtil.getTenant(user.getTenantId());
if(tenant == null){
throw new TokenException(TokenMsg.EXCEPTION_LOGIN_TENANT_NOT_USABLE);

@ -23,7 +23,7 @@ import org.opsli.api.web.system.logs.LogsApi;
import org.opsli.api.wrapper.system.logs.LogsModel;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;

@ -34,7 +34,7 @@ import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.general.StartPrint;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
@ -82,7 +82,7 @@ public class MenuRestController extends BaseRestController<SysMenu, MenuModel, I
UserModel user = UserUtil.getUser();
// 获得全量数据
if(UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
List<SysMenu> menuList = IService.findList(queryBuilder.build());
menuModelList = WrapperUtil.transformInstance(menuList, modelClazz);
}else {

@ -36,7 +36,7 @@ import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.utils.HumpUtil;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.base.entity.HasChildren;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
import org.opsli.core.persistence.querybuilder.QueryBuilder;

@ -17,6 +17,7 @@ package org.opsli.modulars.system.role.web;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.role.RoleMenuRefApi;
@ -116,7 +117,7 @@ public class RoleMenuRefRestController implements RoleMenuRefApi {
// 内置数据 只有超级管理员可以修改
if(roleModel != null && LOCK_DATA.equals(roleModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -140,7 +141,7 @@ public class RoleMenuRefRestController implements RoleMenuRefApi {
private void demoError(){
UserModel user = UserUtil.getUser();
// 演示模式 不允许操作 (超级管理员可以操作)
if(enableDemo && !UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(enableDemo && !StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(CoreMsg.EXCEPTION_ENABLE_DEMO);
}
}

@ -20,6 +20,7 @@ import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.role.RoleApi;
@ -30,7 +31,7 @@ import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.constants.MyBatisConstants;
import org.opsli.common.exception.ServiceException;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
@ -132,7 +133,7 @@ public class RoleRestController extends BaseRestController<SysRole, RoleModel, I
if(roleModel != null && LOCK_DATA.equals(roleModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -161,7 +162,7 @@ public class RoleRestController extends BaseRestController<SysRole, RoleModel, I
// 内置数据 只有超级管理员可以修改
if(roleModel != null && LOCK_DATA.equals(roleModel.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}
@ -197,7 +198,7 @@ public class RoleRestController extends BaseRestController<SysRole, RoleModel, I
// 内置数据 只有超级管理员可以修改
if(sysRole != null && LOCK_DATA.equals(sysRole.getIzLock()) ){
UserModel user = UserUtil.getUser();
if(!UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(!StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(SystemMsg.EXCEPTION_LOCK_DATA);
}
}

@ -18,10 +18,8 @@ package org.opsli.modulars.system.tenant.web;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.role.RoleApi;
@ -31,7 +29,7 @@ import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.GenQueryBuilder;
import org.opsli.core.persistence.querybuilder.QueryBuilder;

@ -16,6 +16,7 @@
package org.opsli.modulars.system.user.web;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.user.UserOrgRefApi;
@ -77,7 +78,7 @@ public class UserOrgRefRestController implements UserOrgRefApi {
private void demoError(){
UserModel user = UserUtil.getUser();
// 演示模式 不允许操作 (超级管理员可以操作)
if(enableDemo && !UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(enableDemo && !StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(CoreMsg.EXCEPTION_ENABLE_DEMO);
}
}

@ -42,7 +42,7 @@ import org.opsli.common.exception.ServiceException;
import org.opsli.common.exception.TokenException;
import org.opsli.common.utils.HumpUtil;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.msg.CoreMsg;
import org.opsli.core.msg.TokenMsg;
import org.opsli.core.persistence.Page;
@ -59,7 +59,6 @@ import org.opsli.modulars.system.user.entity.SysUser;
import org.opsli.modulars.system.user.entity.SysUserAndOrg;
import org.opsli.modulars.system.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
@ -85,11 +84,6 @@ import java.util.Map;
public class UserRestController extends BaseRestController<SysUser, UserModel, IUserService>
implements UserApi {
@Value("${opsli.web.upload-path}")
private String basedir;
@Value("${opsli.default-pass}")
private String defaultPass;
@Autowired
private ISysOrgService iSysOrgService;
@ -125,7 +119,7 @@ public class UserRestController extends BaseRestController<SysUser, UserModel, I
userInfo.setPerms(userAllPermsByUserId);
// 判断是否是超级管理员
if(UserUtil.SUPER_ADMIN.equals(userInfo.getUsername())){
if(StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
userInfo.setIzSuperAdmin(true);
}
@ -209,7 +203,7 @@ public class UserRestController extends BaseRestController<SysUser, UserModel, I
String date = DateUtil.format(DateUtil.date(), "yyyyMMdd");
String dateTime = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");
String packageName = basedir + staticPath+"/"+date;
String packageName = globalProperties.getWeb().getUploadPath() + staticPath+"/"+date;
String fileName = dateTime+"-"+ IdUtil.simpleUUID() +".jpg";
File file = new File(packageName+"/"+fileName);
MultipartFile multipartFile = files.get(0);
@ -264,7 +258,7 @@ public class UserRestController extends BaseRestController<SysUser, UserModel, I
super.demoError();
UserPassword userPassword = new UserPassword();
userPassword.setNewPassword(defaultPass);
userPassword.setNewPassword(globalProperties.getAuth().getDefaultPass());
userPassword.setUserId(userId);
boolean resetPasswordFlag = IService.resetPassword(userPassword);
@ -272,7 +266,7 @@ public class UserRestController extends BaseRestController<SysUser, UserModel, I
return ResultVo.error("重置密码失败");
}
return ResultVo.success("重置密码成功!默认密码为:" + defaultPass);
return ResultVo.success("重置密码成功!默认密码为:" + globalProperties.getAuth().getDefaultPass());
}
/**

@ -16,6 +16,7 @@
package org.opsli.modulars.system.user.web;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.system.user.UserRoleRefApi;
@ -79,7 +80,7 @@ public class UserRoleRefRestController implements UserRoleRefApi {
private void demoError(){
UserModel user = UserUtil.getUser();
// 演示模式 不允许操作 (超级管理员可以操作)
if(enableDemo && !UserUtil.SUPER_ADMIN.equals(user.getUsername())){
if(enableDemo && !StringUtils.equals(UserUtil.SUPER_ADMIN, user.getUsername())){
throw new ServiceException(CoreMsg.EXCEPTION_ENABLE_DEMO);
}
}

@ -17,7 +17,6 @@ package org.opsli.modulars.gentest.carinfo.web;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ReflectUtil;
import org.opsli.core.base.service.interfaces.CrudServiceInterface;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.opsli.common.annotation.RequiresPermissionsCus;
@ -25,7 +24,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;

@ -24,7 +24,7 @@ import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.opsli.api.base.result.ResultVo;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;

@ -11,7 +11,7 @@ import org.opsli.api.wrapper.test.TestModel;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.annotation.EnableLog;
import org.opsli.common.annotation.RequiresPermissionsCus;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.persistence.Page;
import org.opsli.core.persistence.querybuilder.QueryBuilder;
import org.opsli.core.persistence.querybuilder.WebQueryBuilder;

@ -10,9 +10,8 @@ import org.opsli.api.base.result.ResultVo;
import org.opsli.api.web.test.TestApi;
import org.opsli.api.wrapper.system.dict.DictWrapper;
import org.opsli.api.wrapper.test.TestModel;
import org.opsli.common.annotation.ApiRestController;
import org.opsli.common.utils.WrapperUtil;
import org.opsli.core.base.concroller.BaseRestController;
import org.opsli.core.base.controller.BaseRestController;
import org.opsli.core.cache.pushsub.enums.CacheType;
import org.opsli.core.cache.pushsub.msgs.DictMsgFactory;
import org.opsli.core.persistence.Page;

@ -62,10 +62,8 @@ knife4j:
# opsli 自定义配置
opsli:
# 演示模式
enable-demo: true
# web 上传文件路径
web:
upload-path: /www/wwwroot/demo.opsli.com/files

@ -60,10 +60,8 @@ knife4j:
# opsli 自定义配置
opsli:
# 演示模式
enable-demo: false
# web 上传文件路径
web:
upload-path: /Users/system/Documents/work/tmp/opsli

@ -61,10 +61,8 @@ knife4j:
# opsli 自定义配置
opsli:
# 演示模式
enable-demo: true
# web 上传文件路径
web:
upload-path: /Users/system/Documents/work/tmp/opsli

@ -156,18 +156,14 @@ mybatis-plus:
# opsli 自定义配置
# OPSLI 自定义配置
opsli:
# 系统名称
system-name: "OPSLI 快速开发平台"
# 系统启动时间 为空则默认 真实当前系统启动时间
system-starter-time: "2020-09-10 00:00:00"
# token 认证
token-auth:
# 排除过滤url 格式 - List
url-exclusion:
- "/test.html"
# Java 软防火墙
# 软防火墙
waf:
# 开启防护
enable: true
@ -179,18 +175,26 @@ opsli:
order: 0
# 设置xss防护的url拦截路径
url-patterns: "/*"
# 排除过滤url
# 排除过滤URL
url-exclusion:
- "/doc.html"
- "/static/file"
# 认证
auth:
# 超级管理员账号
superadmin: system
# token 有效时间 (分钟) 2小时
token-effective-time: 120
# 重置默认密码
super-admin: system
# 重置默认密码 密码至少包含大小写字母数字且不少于6位
default-pass: Aa123456
# Token
token:
# 默认加密盐值(每个系统需要不一致防止被破解)
secret: 53c0e33c9d4c5538969abf2fcf48351d
# 有效时间 (分钟) 2小时
effective-time: 120
# 排除过滤URL
url-exclusion:
- "/test.html"
# 登录设置
login:
@ -201,18 +205,32 @@ opsli:
# 失败锁定时间(秒)
slip-lock-speed: 300
# Excel
excel:
# Excel 最大导入操作数量 防止OOM
import-max-count: 20000
# Excel 最大导出操作数量 防止OOM
export-max-count: 20000
#加解密
encrypt-decrypt:
enable: rsa
# RSA 加密算法
rsa:
# 公钥
public-key: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCakyyq8rfkmKvKB2fz3hUeuD6tgParCmZmRc1OoL5EN+yXghQmDIrcZhewLZZLUpLQd3T3cRxKaW30nWNfoteNHgKjGYGu4+BZoyHZ8ltTmrolYGopiSwBMhO7kwAD4IK1PZHaoF2wPISH35ubbugykav7dTaWBDuNkvyBiv8qMQIDAQAB"
# 私钥
private-key: "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJqTLKryt+SYq8oHZ/PeFR64Pq2A9qsKZmZFzU6gvkQ37JeCFCYMitxmF7AtlktSktB3dPdxHEppbfSdY1+i140eAqMZga7j4FmjIdnyW1OauiVgaimJLAEyE7uTAAPggrU9kdqgXbA8hIffm5tu6DKRq/t1NpYEO42S/IGK/yoxAgMBAAECgYEAiWu+klwm0LxKPdpHuK7/58e1MVst8PHWB6aW2AhgHxX46NlkQE92RGsfNCnTLDPFAkCxZCrTE/SXJJmn9yY2qoS26OV0PbTGajk96M8lDi9JSmWCNV1eywPecObSyvtPd5jaPtq2jkgNY/hHJjH6kV7UAFZuaSK7jxskfq7uR2ECQQDPfmGjPiMc65+LE9U7jC4LokyUi1yCgN6AY5MgF6fkxUVJD2mtl9BqRK7qE0OnsRb0NzID3PSfa7aA2I0Rlsj/AkEAvrXUBQ6hfuEwD1896qpSJUr7tLidby/3jYwSoewuydDT2duDc2ZCz4/U/1NpxSxWT10ZZi2ExsFZn/3PDylczwJARA3oijkcHSUu69eybVh51bkCswnOasNHtwZxv+niWEdXhTH38EbFxcUHNaDh5MNRiwH7dobm+M7EShg8lJNHEwJAclRdU97OkFr9zeliHCGZd4P5XAFlWHfgJ7p2nR4Teqe3qZ6Aspj2qqpmnd7qxOrsn02H4YqeU+0sBs9I56T7XwJAAg8wHrh/FAPY96mAya0bpv6zm/7bave17vs+8B+fhBEHHuvetfv8Xi/RkXL0rjE4LaTHefoUbZPNbIhNYiN0CQ=="
# SM2 加密算法
sm2:
# 公钥
public-key: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCakyyq8rfkmKvKB2fz3hUeuD6tgParCmZmRc1OoL5EN+yXghQmDIrcZhewLZZLUpLQd3T3cRxKaW30nWNfoteNHgKjGYGu4+BZoyHZ8ltTmrolYGopiSwBMhO7kwAD4IK1PZHaoF2wPISH35ubbugykav7dTaWBDuNkvyBiv8qMQIDAQAB"
# 私钥
private-key: "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJqTLKryt+SYq8oHZ/PeFR64Pq2A9qsKZmZFzU6gvkQ37JeCFCYMitxmF7AtlktSktB3dPdxHEppbfSdY1+i140eAqMZga7j4FmjIdnyW1OauiVgaimJLAEyE7uTAAPggrU9kdqgXbA8hIffm5tu6DKRq/t1NpYEO42S/IGK/yoxAgMBAAECgYEAiWu+klwm0LxKPdpHuK7/58e1MVst8PHWB6aW2AhgHxX46NlkQE92RGsfNCnTLDPFAkCxZCrTE/SXJJmn9yY2qoS26OV0PbTGajk96M8lDi9JSmWCNV1eywPecObSyvtPd5jaPtq2jkgNY/hHJjH6kV7UAFZuaSK7jxskfq7uR2ECQQDPfmGjPiMc65+LE9U7jC4LokyUi1yCgN6AY5MgF6fkxUVJD2mtl9BqRK7qE0OnsRb0NzID3PSfa7aA2I0Rlsj/AkEAvrXUBQ6hfuEwD1896qpSJUr7tLidby/3jYwSoewuydDT2duDc2ZCz4/U/1NpxSxWT10ZZi2ExsFZn/3PDylczwJARA3oijkcHSUu69eybVh51bkCswnOasNHtwZxv+niWEdXhTH38EbFxcUHNaDh5MNRiwH7dobm+M7EShg8lJNHEwJAclRdU97OkFr9zeliHCGZd4P5XAFlWHfgJ7p2nR4Teqe3qZ6Aspj2qqpmnd7qxOrsn02H4YqeU+0sBs9I56T7XwJAAg8wHrh/FAPY96mAya0bpv6zm/7bave17vs+8B+fhBEHHuvetfv8Xi/RkXL0rjE4LaTHefoUbZPNbIhNYiN0CQ=="
# Excel 最大操作数量 防止OOM
excel-max-count: 20000
# 系统启动时间 为空则默认 真实当前系统启动时间
system-starter-time: "2020-09-10 00:00:00"

@ -83,6 +83,7 @@
<shiro.version>1.6.0</shiro.version>
<shiro.redis.version>3.1.0</shiro.redis.version>
<snakeyaml.version>1.27</snakeyaml.version>
<bouncycastle.version>1.68</bouncycastle.version>
</properties>
@ -143,6 +144,13 @@
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- 热部署 如果使用 Jrebel 忽略就好,如果不使用 Jrebel 则放开 -->
<!--
<dependency>
@ -258,6 +266,14 @@
<version>${hutool.version}</version>
</dependency>
<!-- 国密算法包 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>${bouncycastle.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.yaml/snakeyaml -->
<dependency>
<groupId>org.yaml</groupId>

Loading…
Cancel
Save