Explorar el Código

get post put加密请求 delete不做加密

lixueqiang hace 2 años
padre
commit
6ff089c9e4

+ 3 - 2
kxs-admin-ui/.env

@@ -16,8 +16,9 @@ VITE_OAUTH2_MOBILE_CLIENT='admin:kmdlqkyuvl'
 # 是否开启前端验证码
 VITE_VERIFY_ENABLE = true
 
-# 前端加密密钥
-#VITE_PWD_ENC_KEY='NfNg4zkpMcBP8hty'
+# 前端加密密钥和盐值
+VITE_PWD_ENC_KEY='CBTU1dD4Kd5pyiGWTsI10jRQ3SvKusSV'
+VITE_PWD_ENC_IV='DYgjCEIMVrj2W9xN'
 
 # 是否开启websocket 消息接受,
 VITE_WEBSOCKET_ENABLE = false

+ 6 - 7
kxs-admin-ui/src/api/login/index.ts

@@ -8,7 +8,7 @@ import other from '/@/utils/other';
  * https://www.ietf.org/rfc/rfc6749.txt
  * OAuth 协议 4.3.1 要求格式为 form 而不是 JSON 注意!
  */
-const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded';
+const FORM_CONTENT_TYPE = 'application/json';
 
 /**
  * 登录
@@ -18,16 +18,15 @@ export const login = (data: any) => {
     const basicAuth = 'Basic ' + window.btoa(import.meta.env.VITE_OAUTH2_PASSWORD_CLIENT);
     Session.set('basicAuth', basicAuth);
     let encPassword = data.password;
-    // 密码加密
-    if (import.meta.env.VITE_PWD_ENC_KEY) {
-        encPassword = other.encryption(data.password, import.meta.env.VITE_PWD_ENC_KEY);
-    }
+
     const {username, randomStr, code, grant_type, scope} = data;
+    // 请求分开
+    const param = {username: username, password: encPassword}
     return request({
         url: '/admin/oauth2/token',
         method: 'post',
-        params: {username, randomStr, code, grant_type, scope},
-        data: {password: encPassword},
+        params: {randomStr, code, grant_type, scope},
+        data: param,
         headers: {
             skipToken: true,
             Authorization: basicAuth,

+ 18 - 14
kxs-admin-ui/src/utils/other.ts

@@ -199,13 +199,15 @@ export const openWindow = (url: string, title: string, w: number, h: number) =>
 /**
  *加密处理
  */
-export function encryption(src: string, keyWord: string) {
-    const key = CryptoJS.enc.Utf8.parse(keyWord);
+export function encryption(src: string) {
+    const key = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_PWD_ENC_KEY);
+    const iv = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_PWD_ENC_IV);
     // 加密
     var encrypted = CryptoJS.AES.encrypt(src, key, {
-        iv: key,
-        mode: CryptoJS.mode.CFB,
-        padding: CryptoJS.pad.NoPadding,
+        key: key,
+        iv: iv,
+        mode: CryptoJS.mode.CBC,
+        padding: CryptoJS.pad.Pkcs7,
     });
     return encrypted.toString();
 }
@@ -215,13 +217,15 @@ export function encryption(src: string, keyWord: string) {
  * @param {*} params 参数列表
  * @returns 明文
  */
-export function decryption(src: string, keyWord: string) {
-    const key = CryptoJS.enc.Utf8.parse(keyWord);
+export function decryption(src: string) {
+    const key = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_PWD_ENC_KEY);
+    const iv = CryptoJS.enc.Utf8.parse(import.meta.env.VITE_PWD_ENC_IV);
     // 解密逻辑
     var decryptd = CryptoJS.AES.decrypt(src, key, {
-        iv: key,
-        mode: CryptoJS.mode.CFB,
-        padding: CryptoJS.pad.NoPadding,
+        key: key,
+        iv: iv,
+        mode: CryptoJS.mode.CBC,
+        padding: CryptoJS.pad.Pkcs7,
     });
 
     return decryptd.toString(CryptoJS.enc.Utf8);
@@ -355,11 +359,11 @@ const other = {
     handleOpenLink: (val: RouteItem) => {
         handleOpenLink(val);
     },
-    encryption: (src: string, keyWord: string) => {
-        return encryption(src, keyWord);
+    encryption: (src: string) => {
+        return encryption(src);
     },
-    decryption: (src: string, keyWord: string) => {
-        return decryption(src, keyWord);
+    decryption: (src: string) => {
+        return decryption(src);
     },
     base64Encrypt: (data: any) => {
         return base64Encrypt(data);

+ 16 - 11
kxs-admin-ui/src/utils/request.ts

@@ -1,6 +1,6 @@
-import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
-import { Session } from '/@/utils/storage';
-import { useMessageBox } from '/@/hooks/message';
+import axios, {AxiosInstance, AxiosRequestConfig, AxiosResponse} from 'axios';
+import {Session} from '/@/utils/storage';
+import {useMessageBox} from '/@/hooks/message';
 import qs from 'qs';
 import other from './other';
 
@@ -29,15 +29,19 @@ service.interceptors.request.use(
 		if (token && !config.headers?.skipToken) {
 			config.headers![CommonHeaderEnum.AUTHORIZATION] = `Bearer ${token}`;
 		}
-
 		// 请求报文加密
-		if (config.headers![CommonHeaderEnum.ENC_FLAG]) {
-			const enc = other.encryption(JSON.stringify(config.data), import.meta.env.VITE_PWD_ENC_KEY);
-			config.data = {
-				encryption: enc,
-			};
+		if(config.method == "get"){
+			let newParam = config.params || {};
+			const enc = other.encryption(JSON.stringify(newParam));
+			config.params = {
+				value: encodeURI(enc)
+			}
+		}
+		if(config.method == "post" || config.method == "put"){
+			let data = config.data;
+			config.data = other.encryption(JSON.stringify(data))
+			config.headers!['Content-Type'] = 'application/json'
 		}
-
 		// 自动适配单体和微服务架构不同的URL
 		config.url = other.adaptationUrl(config.url);
 
@@ -62,7 +66,7 @@ const handleResponse = (response: AxiosResponse<any>) => {
 
 	// 针对密文返回解密
 	if (response.data.encryption) {
-		const originData = JSON.parse(other.decryption(response.data.encryption, import.meta.env.VITE_PWD_ENC_KEY));
+		const originData = JSON.parse(other.decryption(response.data.encryption));
 		response.data = originData;
 		return response.data;
 	}
@@ -74,6 +78,7 @@ const handleResponse = (response: AxiosResponse<any>) => {
  * 添加 Axios 的响应拦截器,用于全局响应结果处理
  */
 service.interceptors.response.use(handleResponse, (error) => {
+	console.log(error)
 	const status = Number(error.response.status) || 200;
 	if (status === 424) {
 		useMessageBox()

+ 2 - 2
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/support/handler/SkyAuthenticationSuccessEventHandler.java

@@ -1,7 +1,7 @@
 package com.kxs.common.security.support.handler;
 
 import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.text.CharSequenceUtil;
 import com.kxs.common.core.constant.CommonConstants;
 import com.kxs.common.core.constant.SecurityConstants;
 import com.kxs.common.core.util.SpringContextHolder;
@@ -59,7 +59,7 @@ public class SkyAuthenticationSuccessEventHandler implements AuthenticationSucce
 			SysLog logVo = SysLogUtils.getSysLog();
 			logVo.setTitle("登录成功");
 			String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME);
-			if (StrUtil.isNotBlank(startTimeStr)) {
+			if (CharSequenceUtil.isNotBlank(startTimeStr)) {
 				Long startTime = Long.parseLong(startTimeStr);
 				Long endTime = System.currentTimeMillis();
 				logVo.setTime(endTime - startTime);

+ 6 - 10
kxs-common/kxs-common-security/src/main/java/com/kxs/common/security/util/OAuth2EndpointUtils.java

@@ -17,9 +17,7 @@ import org.springframework.util.StreamUtils;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
-import java.lang.reflect.Field;
 import java.time.temporal.ChronoUnit;
-import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -38,7 +36,7 @@ public class OAuth2EndpointUtils {
 		try(ByteArrayOutputStream baos = new ByteArrayOutputStream()){
 			StreamUtils.copy(request.getInputStream(), baos);
 			String bodyStr = baos.toString();
-			Map body = JSON.parseObject(bodyStr, Map.class);
+			JSONObject body = JSON.parseObject(bodyStr);
 
 			Map<String, String[]> parameterMap = request.getParameterMap();
 			MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(parameterMap.size());
@@ -48,15 +46,14 @@ public class OAuth2EndpointUtils {
 				}
 			});
 			if(body != null && !body.isEmpty()){
-				for(Object key:body.keySet()){
-					String value = body.get(key).toString();
-					parameters.add(key.toString(), value);
-				}
+                body.keySet().forEach(key -> {
+                    String value = body.get(key).toString();
+                    parameters.add(key, value);
+                });
 			}
 
 			return parameters;
 		}catch (IOException e){
-			e.printStackTrace();
 			throw new OAuth2AuthenticationException("获取参数异常");
 		}
 	}
@@ -70,8 +67,7 @@ public class OAuth2EndpointUtils {
 	 * 格式化输出token 信息
 	 * @param authentication 用户认证信息
 	 * @param claims 扩展信息
-	 * @return
-	 * @throws IOException
+	 * @return token
 	 */
 	public OAuth2AccessTokenResponse sendAccessTokenResponse(OAuth2Authorization authentication,
 			Map<String, Object> claims) {

+ 3 - 5
kxs-gateway/src/main/java/com/kxs/gateway/api/filter/RequestDecoderFilter.java

@@ -58,7 +58,7 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 				return decryptGetRequestParam(exchange, chain);
 			}
 
-			if (method == HttpMethod.POST) {
+			if (method == HttpMethod.POST || method == HttpMethod.PUT) {
 				return decryptPostBodyParam(exchange, chain);
 			}
 
@@ -140,16 +140,14 @@ public class RequestDecoderFilter extends AbstractGatewayFilterFactory<Object> {
 		try {
 			MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
 			String decryptedParam = queryParams.getFirst(PARAM_NAME);
-			log.info("GET请求待解密数据 :{}", decryptedParam);
+			log.info("GET:{},请求待解密数据 :{}", exchange.getRequest().getURI(),decryptedParam);
 			String decryptStr = cryptoAes.decryptStr(decryptedParam);
 			log.info("GET解密后数据 :{}", decryptStr);
 
 			JSONObject decryptJson = JSON.parseObject(decryptStr);
 			//构建新的请求参数webflux
 			MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(decryptJson.size());
-			decryptJson.forEach((key, value) -> {
-				parameters.add(key, (String) value);
-			});
+			decryptJson.forEach((key, value) -> parameters.add(key, String.valueOf(value)));
 			// 构建修改后的URI
 			URI modifiedUri = UriComponentsBuilder.fromUri(exchange.getRequest().getURI())
 					.replaceQueryParams(parameters)