|
@@ -7,14 +7,19 @@ import cn.dev33.satoken.exception.NotRoleException;
|
|
|
import cn.dev33.satoken.filter.SaServletFilter;
|
|
|
import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
|
|
|
import cn.dev33.satoken.router.SaRouter;
|
|
|
+import cn.dev33.satoken.spring.SpringMVCUtil;
|
|
|
import cn.dev33.satoken.stp.StpLogic;
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.extra.servlet.ServletUtil;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.aliyun.oss.HttpMethod;
|
|
|
import com.fdkankan.fusion.common.ResultCode;
|
|
|
import com.fdkankan.fusion.common.ResultData;
|
|
|
+import com.fdkankan.fusion.common.util.AesUtil;
|
|
|
import com.fdkankan.fusion.common.util.RedisKeyUtil;
|
|
|
+import com.fdkankan.fusion.common.util.SignUtil;
|
|
|
import com.fdkankan.fusion.controller.LoginController;
|
|
|
import com.fdkankan.fusion.exception.BusinessException;
|
|
|
import com.fdkankan.fusion.httpClient.FdService;
|
|
@@ -30,7 +35,11 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
+import java.util.Objects;
|
|
|
|
|
|
@Configuration
|
|
|
@Slf4j
|
|
@@ -48,10 +57,17 @@ public class SaTokenConfigure {
|
|
|
.addInclude("/**").addExclude("/**/test/**","/**/inner/**","/**/notAuth/**","/**/systemSetting/**","/**/downMD5/**","/**/downDocx/**","/**ws/**")
|
|
|
// 认证函数: 每次请求执行
|
|
|
.setAuth(obj -> {
|
|
|
- SaRouter.match("/**", "/fdLogin", r ->checkLogin() );
|
|
|
+ String sign = SaHolder.getRequest().getHeader("sign");
|
|
|
String pageType = SaHolder.getRequest().getHeader("page-type");
|
|
|
String caseId = SaHolder.getRequest().getHeader("caseId");
|
|
|
- SaRouter.match("/**", "/case/addScene", r ->checkCaseAuth(caseId,pageType));
|
|
|
+ if(StringUtils.isNotBlank(sign)){
|
|
|
+ String clientIP = ServletUtil.getClientIP(SpringMVCUtil.getRequest());
|
|
|
+ SaRouter.match("/**", "/case/addScene", r -> checkSign(sign,clientIP));
|
|
|
+ }else {
|
|
|
+ SaRouter.match("/**", "/fdLogin", r ->checkLogin() );
|
|
|
+ SaRouter.match("/**", "/case/addScene", r ->checkCaseAuth(caseId,pageType));
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
SaRouter.match("/sceneDownLog/list", r -> StpUtil.checkRoleOr("admin-super","admin-system","admin") );
|
|
|
|
|
@@ -98,6 +114,7 @@ public class SaTokenConfigure {
|
|
|
aj = ResultData.error(ee.getCode(),ee.getMessage());
|
|
|
}
|
|
|
else { // 普通异常, 输出:500 + 异常信息
|
|
|
+ log.info("500",e);
|
|
|
aj = ResultData.error(ResultCode.SYSTEM_ERROR);
|
|
|
}
|
|
|
return JSONObject.toJSONString(aj);
|
|
@@ -146,6 +163,53 @@ public class SaTokenConfigure {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ public void checkSign(String sign,String remoteIp){
|
|
|
+ if(StringUtils.isBlank(sign)){
|
|
|
+ throw new BusinessException(ResultCode.AUTH_ERROR.code, "签名为空");
|
|
|
+ }
|
|
|
+ String userName = null, ip = null, timestamp = null;
|
|
|
+
|
|
|
+ if(StrUtil.isNotEmpty(sign)){
|
|
|
+ sign = sign.replaceAll("%2B", "+").replaceAll(" ", "+");
|
|
|
+ String[] split = null;
|
|
|
+ try {
|
|
|
+ String decode = AesUtil.decryptECB(sign, SignUtil.ENCRYPT_KEY, "AES/ECB/PKCS5Padding");
|
|
|
+ split = decode.split("@");
|
|
|
+
|
|
|
+ }catch (Exception e){
|
|
|
+ log.info("签名解密失败", e);
|
|
|
+ throw new BusinessException(ResultCode.AUTH_ERROR.code, "签名解密失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(Objects.isNull(split) || split.length == 1){
|
|
|
+ throw new BusinessException(ResultCode.AUTH_ERROR.code, "签名参数错误");
|
|
|
+ }else{
|
|
|
+ for (int i = 0; i < split.length; i++){
|
|
|
+ if(i == 0){
|
|
|
+ userName = split[i];
|
|
|
+ }
|
|
|
+ if(i == 1){
|
|
|
+ ip = split[i];
|
|
|
+ }
|
|
|
+ if(i == 2){
|
|
|
+ timestamp = split[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ log.info("请求ip:{}", remoteIp);
|
|
|
+ log.info("参数ip:{}", ip);
|
|
|
+ if(StrUtil.isNotEmpty(ip) && !ip.equals(remoteIp)){
|
|
|
+ throw new BusinessException(ResultCode.AUTH_ERROR.code, "ip不匹配");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(StrUtil.isNotEmpty(timestamp) && Calendar.getInstance().getTime().after(new Date(Long.valueOf(timestamp) * 1000))){
|
|
|
+ throw new BusinessException(ResultCode.AUTH_ERROR.code, "超出访问截止时间");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
//Sa-Token 整合 jwt
|
|
|
//Stateless 无状态模式 纯jwt
|
|
|
//Mixin 混入模式 jwt 与 Redis 逻辑混合
|