refactor: 用户登录时用户名和密码使用密文传输

Closes #1094
This commit is contained in:
Captain.B 2021-03-12 15:07:12 +08:00
parent 637739459e
commit 306600c73a
8 changed files with 546 additions and 239 deletions

View File

@ -0,0 +1,16 @@
package io.metersphere.commons.utils;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class RsaKey {
//公钥
private String publicKey;
//私钥
private String privateKey;
}

View File

@ -0,0 +1,224 @@
package io.metersphere.commons.utils;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
public class RsaUtil {
public static final String CHARSET = "UTF-8";
public static final String RSA_ALGORITHM = "RSA";
/**
* 创建RSA 公钥-私钥
*/
public static RsaKey createKeys() throws NoSuchAlgorithmException {
return createKeys(1024);
}
/**
* 创建RSA 公钥-私钥
*/
public static RsaKey createKeys(int keySize) throws NoSuchAlgorithmException {
//为RSA算法创建一个KeyPairGenerator对象
KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);
//初始化KeyPairGenerator对象,密钥长度
kpg.initialize(keySize);
//生成密匙对
KeyPair keyPair = kpg.generateKeyPair();
//得到公钥
Key publicKey = keyPair.getPublic();
String publicKeyStr = new String(Base64.encodeBase64(publicKey.getEncoded()));
//得到私钥
Key privateKey = keyPair.getPrivate();
String privateKeyStr = new String(Base64.encodeBase64(privateKey.getEncoded()));
RsaKey rsaKey = new RsaKey();
rsaKey.setPublicKey(publicKeyStr);
rsaKey.setPrivateKey(privateKeyStr);
return rsaKey;
}
/**
* 公钥加密
*
* @param originalText 原文
* @param publicKey 公钥
*/
public static String publicEncrypt(String originalText, String publicKey) throws NoSuchAlgorithmException {
RSAPublicKey rsaPublicKey = getPublicKey(publicKey);
return publicEncrypt(originalText, rsaPublicKey);
}
/**
* 公钥解密
*
* @param cipherText 密文
* @param publicKey 公钥
*/
public static String publicDecrypt(String cipherText, String publicKey) throws NoSuchAlgorithmException {
RSAPublicKey rsaPublicKey = getPublicKey(publicKey);
return publicDecrypt(cipherText, rsaPublicKey);
}
/**
* 私钥加密
*
* @param originalText 原文
* @param privateKey 私钥
*/
public static String privateEncrypt(String originalText, String privateKey) throws NoSuchAlgorithmException {
RSAPrivateKey rsaPrivateKey = getPrivateKey(privateKey);
return privateEncrypt(originalText, rsaPrivateKey);
}
/**
* 私钥解密
*
* @param cipherText 密文
* @param privateKey 私钥
*/
public static String privateDecrypt(String cipherText, String privateKey) throws NoSuchAlgorithmException {
RSAPrivateKey rsaPrivateKey = getPrivateKey(privateKey);
return privateDecrypt(cipherText, rsaPrivateKey);
}
/**
* 得到公钥
*
* @param publicKey 密钥字符串经过base64编码
*/
private static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException {
//通过X509编码的Key指令获得公钥对象
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
RSAPublicKey key = null;
try {
key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return key;
}
/**
* 公钥加密
*
* @param originalText 原文
* @param publicKey 公钥
*/
private static String publicEncrypt(String originalText, RSAPublicKey publicKey) {
try {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, originalText.getBytes(CHARSET), publicKey.getModulus().bitLength()));
} catch (Exception e) {
throw new RuntimeException("加密字符串[" + originalText + "]时遇到异常", e);
}
}
/**
* 得到私钥
*
* @param privateKey 密钥字符串经过base64编码
*/
private static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException {
//通过PKCS#8编码的Key指令获得私钥对象
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
RSAPrivateKey key = null;
try {
key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return key;
}
/**
* 私钥解密
*
* @param cipherText 密文
* @param privateKey 私钥
*/
private static String privateDecrypt(String cipherText, RSAPrivateKey privateKey) {
try {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(cipherText), privateKey.getModulus().bitLength()), CHARSET);
} catch (Exception e) {
throw new RuntimeException("解密字符串[" + cipherText + "]时遇到异常", e);
}
}
private static String privateEncrypt(String originalText, RSAPrivateKey privateKey) {
try {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, originalText.getBytes(CHARSET), privateKey.getModulus().bitLength()));
} catch (Exception e) {
throw new RuntimeException("加密字符串[" + originalText + "]时遇到异常", e);
}
}
private static String publicDecrypt(String cipherText, RSAPublicKey publicKey) {
try {
Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(cipherText), publicKey.getModulus().bitLength()), CHARSET);
} catch (Exception e) {
throw new RuntimeException("解密字符串[" + cipherText + "]时遇到异常", e);
}
}
private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) {
int maxBlock;
if (opmode == Cipher.DECRYPT_MODE) {
maxBlock = keySize / 8;
} else {
maxBlock = keySize / 8 - 11;
}
int offSet = 0;
byte[] buff;
int i = 0;
try (
ByteArrayOutputStream out = new ByteArrayOutputStream()
) {
while (datas.length > offSet) {
if (datas.length - offSet > maxBlock) {
buff = cipher.doFinal(datas, offSet, maxBlock);
} else {
buff = cipher.doFinal(datas, offSet, datas.length - offSet);
}
out.write(buff, 0, buff.length);
i++;
offSet = i * maxBlock;
}
return out.toByteArray();
} catch (Exception e) {
throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e);
}
}
}

View File

@ -0,0 +1,16 @@
package io.metersphere.config;
import io.metersphere.commons.utils.RsaKey;
import io.metersphere.commons.utils.RsaUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.security.NoSuchAlgorithmException;
@Configuration
public class RsaConfig {
@Bean
public RsaKey rsaKey() throws NoSuchAlgorithmException {
return RsaUtil.createKeys();
}
}

View File

@ -2,6 +2,8 @@ package io.metersphere.controller;
import io.metersphere.commons.constants.UserSource; import io.metersphere.commons.constants.UserSource;
import io.metersphere.commons.user.SessionUser; import io.metersphere.commons.user.SessionUser;
import io.metersphere.commons.utils.RsaKey;
import io.metersphere.commons.utils.RsaUtil;
import io.metersphere.commons.utils.SessionUtils; import io.metersphere.commons.utils.SessionUtils;
import io.metersphere.controller.request.LoginRequest; import io.metersphere.controller.request.LoginRequest;
import io.metersphere.service.BaseDisplayService; import io.metersphere.service.BaseDisplayService;
@ -23,6 +25,8 @@ public class LoginController {
private UserService userService; private UserService userService;
@Resource @Resource
private BaseDisplayService baseDisplayService; private BaseDisplayService baseDisplayService;
@Resource
private RsaKey rsaKey;
@GetMapping(value = "/isLogin") @GetMapping(value = "/isLogin")
public ResultHolder isLogin() { public ResultHolder isLogin() {
@ -33,7 +37,7 @@ public class LoginController {
} }
return ResultHolder.success(user); return ResultHolder.success(user);
} }
return ResultHolder.error(""); return ResultHolder.error(rsaKey.getPublicKey());
} }
@PostMapping(value = "/signin") @PostMapping(value = "/signin")

View File

@ -1,12 +1,36 @@
package io.metersphere.controller.request; package io.metersphere.controller.request;
import io.metersphere.commons.utils.CommonBeanFactory;
import io.metersphere.commons.utils.RsaKey;
import io.metersphere.commons.utils.RsaUtil;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.security.NoSuchAlgorithmException;
@Getter @Getter
@Setter @Setter
public class LoginRequest { public class LoginRequest {
private String username; private String username;
private String password; private String password;
private String authenticate; private String authenticate;
public String getUsername() {
try {
RsaKey rsaKey = CommonBeanFactory.getBean(RsaKey.class);
return RsaUtil.privateDecrypt(username, rsaKey.getPrivateKey());
} catch (NoSuchAlgorithmException e) {
return username;
}
}
public String getPassword() {
try {
RsaKey rsaKey = CommonBeanFactory.getBean(RsaKey.class);
return RsaUtil.privateDecrypt(password, rsaKey.getPrivateKey());
} catch (NoSuchAlgorithmException e) {
return password;
}
}
} }

View File

@ -49,7 +49,8 @@
"xml-js": "^1.6.11", "xml-js": "^1.6.11",
"yan-progress": "^1.0.3", "yan-progress": "^1.0.3",
"jsonpath": "^1.1.0", "jsonpath": "^1.1.0",
"vue-minder-editor-plus": "^1.0.14" "vue-minder-editor-plus": "^1.0.14",
"jsencrypt": "^3.1.0"
}, },
"devDependencies": { "devDependencies": {
"@vue/cli-plugin-babel": "^4.1.0", "@vue/cli-plugin-babel": "^4.1.0",

View File

@ -1,366 +1,378 @@
import { import {
COUNT_NUMBER, COUNT_NUMBER_SHALLOW, COUNT_NUMBER,
LicenseKey, ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER_SHALLOW,
PROJECT_ID, LicenseKey,
REFRESH_SESSION_USER_URL, ORIGIN_COLOR,
ROLE_ADMIN, ORIGIN_COLOR_SHALLOW,
ROLE_ORG_ADMIN, PROJECT_ID,
ROLE_TEST_MANAGER, REFRESH_SESSION_USER_URL,
ROLE_TEST_USER, ROLE_ADMIN,
ROLE_TEST_VIEWER, ROLE_ORG_ADMIN,
TokenKey ROLE_TEST_MANAGER,
ROLE_TEST_USER,
ROLE_TEST_VIEWER,
TokenKey
} from "./constants"; } from "./constants";
import axios from "axios"; import axios from "axios";
import {jsPDF} from "jspdf"; import {jsPDF} from "jspdf";
import JSEncrypt from 'jsencrypt';
export function hasRole(role) { export function hasRole(role) {
let user = getCurrentUser(); let user = getCurrentUser();
let roles = user.roles.map(r => r.id); let roles = user.roles.map(r => r.id);
return roles.indexOf(role) > -1; return roles.indexOf(role) > -1;
} }
// 是否含有某个角色 // 是否含有某个角色
export function hasRoles(...roles) { export function hasRoles(...roles) {
let user = getCurrentUser(); let user = getCurrentUser();
let rs = user.roles.map(r => r.id); let rs = user.roles.map(r => r.id);
for (let item of roles) { for (let item of roles) {
if (rs.indexOf(item) > -1) { if (rs.indexOf(item) > -1) {
return true; return true;
}
} }
} return false;
return false;
} }
export function hasRolePermission(role) { export function hasRolePermission(role) {
let user = getCurrentUser(); let user = getCurrentUser();
for (let ur of user.userRoles) { for (let ur of user.userRoles) {
if (role === ur.roleId) { if (role === ur.roleId) {
if (ur.roleId === ROLE_ADMIN) { if (ur.roleId === ROLE_ADMIN) {
return true; return true;
} else if (ur.roleId === ROLE_ORG_ADMIN && user.lastOrganizationId === ur.sourceId) { } else if (ur.roleId === ROLE_ORG_ADMIN && user.lastOrganizationId === ur.sourceId) {
return true; return true;
} else if (user.lastWorkspaceId === ur.sourceId) { } else if (user.lastWorkspaceId === ur.sourceId) {
return true; return true;
} }
}
} }
} return false
return false
} }
export function hasLicense() { export function hasLicense() {
let v = localStorage.getItem(LicenseKey); let v = localStorage.getItem(LicenseKey);
return v === 'valid'; return v === 'valid';
} }
//是否含有对应组织或工作空间的角色 //是否含有对应组织或工作空间的角色
export function hasRolePermissions(...roles) { export function hasRolePermissions(...roles) {
for (let role of roles) { for (let role of roles) {
if (hasRolePermission(role)) { if (hasRolePermission(role)) {
return true; return true;
}
} }
} return false;
return false;
} }
export function checkoutCurrentOrganization() { export function checkoutCurrentOrganization() {
// 查看当前用户是否是 lastOrganizationId 的组织管理员 // 查看当前用户是否是 lastOrganizationId 的组织管理员
return hasRolePermissions(ROLE_ORG_ADMIN); return hasRolePermissions(ROLE_ORG_ADMIN);
} }
export function checkoutCurrentWorkspace() { export function checkoutCurrentWorkspace() {
// 查看当前用户是否是 lastWorkspaceId 的工作空间用户 // 查看当前用户是否是 lastWorkspaceId 的工作空间用户
return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER, ROLE_TEST_VIEWER); return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER, ROLE_TEST_VIEWER);
} }
export function checkoutTestManagerOrTestUser() { export function checkoutTestManagerOrTestUser() {
return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER); return hasRolePermissions(ROLE_TEST_MANAGER, ROLE_TEST_USER);
} }
export function getCurrentOrganizationId() { export function getCurrentOrganizationId() {
let user = getCurrentUser(); let user = getCurrentUser();
return user.lastOrganizationId; return user.lastOrganizationId;
} }
export function getCurrentWorkspaceId() { export function getCurrentWorkspaceId() {
let user = getCurrentUser(); let user = getCurrentUser();
return user.lastWorkspaceId; return user.lastWorkspaceId;
} }
export function getCurrentUser() { export function getCurrentUser() {
return JSON.parse(localStorage.getItem(TokenKey)); return JSON.parse(localStorage.getItem(TokenKey));
} }
export function getCurrentProjectID() { export function getCurrentProjectID() {
return localStorage.getItem(PROJECT_ID); return localStorage.getItem(PROJECT_ID);
} }
export function saveLocalStorage(response) { export function saveLocalStorage(response) {
// 登录信息保存 cookie // 登录信息保存 cookie
localStorage.setItem(TokenKey, JSON.stringify(response.data)); localStorage.setItem(TokenKey, JSON.stringify(response.data));
let rolesArray = response.data.roles; let rolesArray = response.data.roles;
let roles = rolesArray.map(r => r.id); let roles = rolesArray.map(r => r.id);
// 保存角色 // 保存角色
localStorage.setItem("roles", roles); localStorage.setItem("roles", roles);
} }
export function saveLicense(data) { export function saveLicense(data) {
// 保存License // 保存License
localStorage.setItem(LicenseKey, data); localStorage.setItem(LicenseKey, data);
} }
export function refreshSessionAndCookies(sign, sourceId) { export function refreshSessionAndCookies(sign, sourceId) {
axios.post(REFRESH_SESSION_USER_URL + "/" + sign + "/" + sourceId).then(r => { axios.post(REFRESH_SESSION_USER_URL + "/" + sign + "/" + sourceId).then(r => {
saveLocalStorage(r.data); saveLocalStorage(r.data);
window.location.reload(); window.location.reload();
}) })
} }
export function jsonToMap(jsonStr) { export function jsonToMap(jsonStr) {
let obj = JSON.parse(jsonStr); let obj = JSON.parse(jsonStr);
let strMap = new Map(); let strMap = new Map();
for (let k of Object.keys(obj)) { for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]); strMap.set(k, obj[k]);
} }
return strMap; return strMap;
} }
export function mapToJson(strMap) { export function mapToJson(strMap) {
let obj = Object.create(null); let obj = Object.create(null);
for (let [k, v] of strMap) { for (let [k, v] of strMap) {
obj[k] = v; obj[k] = v;
} }
return JSON.stringify(obj); return JSON.stringify(obj);
} }
// 驼峰转换下划线 // 驼峰转换下划线
export function humpToLine(name) { export function humpToLine(name) {
return name.replace(/([A-Z])/g, "_$1").toLowerCase(); return name.replace(/([A-Z])/g, "_$1").toLowerCase();
} }
export function downloadFile(name, content) { export function downloadFile(name, content) {
const blob = new Blob([content]); const blob = new Blob([content]);
if ("download" in document.createElement("a")) { if ("download" in document.createElement("a")) {
// 非IE下载 // 非IE下载
// chrome/firefox // chrome/firefox
let aTag = document.createElement('a'); let aTag = document.createElement('a');
aTag.download = name; aTag.download = name;
aTag.href = URL.createObjectURL(blob); aTag.href = URL.createObjectURL(blob);
aTag.click(); aTag.click();
URL.revokeObjectURL(aTag.href) URL.revokeObjectURL(aTag.href)
} else { } else {
// IE10+下载 // IE10+下载
navigator.msSaveBlob(blob, name) navigator.msSaveBlob(blob, name)
} }
} }
export function listenGoBack(callback) { export function listenGoBack(callback) {
//监听浏览器返回操作,关闭该对话框 //监听浏览器返回操作,关闭该对话框
if (window.history && window.history.pushState) { if (window.history && window.history.pushState) {
history.pushState(null, null, document.URL); history.pushState(null, null, document.URL);
window.addEventListener('popstate', callback); window.addEventListener('popstate', callback);
} }
} }
export function removeGoBackListener(callback) { export function removeGoBackListener(callback) {
window.removeEventListener('popstate', callback); window.removeEventListener('popstate', callback);
} }
export const uuid = function () { export const uuid = function () {
let d = new Date().getTime(); let d = new Date().getTime();
let d2 = (performance && performance.now && (performance.now() * 1000)) || 0; let d2 = (performance && performance.now && (performance.now() * 1000)) || 0;
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
let r = Math.random() * 16; let r = Math.random() * 16;
if (d > 0) { if (d > 0) {
r = (d + r) % 16 | 0; r = (d + r) % 16 | 0;
d = Math.floor(d / 16); d = Math.floor(d / 16);
} else { } else {
r = (d2 + r) % 16 | 0; r = (d2 + r) % 16 | 0;
d2 = Math.floor(d2 / 16); d2 = Math.floor(d2 / 16);
} }
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16); return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
}); });
}; };
export function getUUID() { export function getUUID() {
function S4() { function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
} }
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4()); return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
} }
export function exportPdf(name, canvasList) { export function exportPdf(name, canvasList) {
let pdf = new jsPDF('', 'pt', 'a4'); let pdf = new jsPDF('', 'pt', 'a4');
// 当前页面的当前高度 // 当前页面的当前高度
let currentHeight = 0; let currentHeight = 0;
for (let canvas of canvasList) { for (let canvas of canvasList) {
if (canvas) { if (canvas) {
let contentWidth = canvas.width; let contentWidth = canvas.width;
let contentHeight = canvas.height; let contentHeight = canvas.height;
//a4纸的尺寸[595.28,841.89] //a4纸的尺寸[595.28,841.89]
let a4Width = 592.28; let a4Width = 592.28;
let a4Height = 841.89; let a4Height = 841.89;
// html页面生成的canvas在pdf中图片的宽高 // html页面生成的canvas在pdf中图片的宽高
let imgWidth = a4Width; let imgWidth = a4Width;
let imgHeight = a4Width / contentWidth * contentHeight; let imgHeight = a4Width / contentWidth * contentHeight;
let pageData = canvas.toDataURL('image/jpeg', 1.0); let pageData = canvas.toDataURL('image/jpeg', 1.0);
// 当前图片的剩余高度 // 当前图片的剩余高度
let leftHeight = imgHeight; let leftHeight = imgHeight;
// 当前页面的剩余高度 // 当前页面的剩余高度
let blankHeight = a4Height - currentHeight; let blankHeight = a4Height - currentHeight;
if (leftHeight > blankHeight) { if (leftHeight > blankHeight) {
//页面偏移 //页面偏移
let position = 0; let position = 0;
while (leftHeight > 0) { while (leftHeight > 0) {
// 本次添加占用的高度 // 本次添加占用的高度
let occupation = a4Height - currentHeight; let occupation = a4Height - currentHeight;
pdf.addImage(pageData, 'JPEG', 0, position + currentHeight, imgWidth, imgHeight); pdf.addImage(pageData, 'JPEG', 0, position + currentHeight, imgWidth, imgHeight);
currentHeight = leftHeight; currentHeight = leftHeight;
leftHeight -= occupation; leftHeight -= occupation;
position -= occupation; position -= occupation;
//避免添加空白页 //避免添加空白页
if (leftHeight > 0) { if (leftHeight > 0) {
pdf.addPage(); pdf.addPage();
currentHeight = 0; currentHeight = 0;
} }
}
} else {
pdf.addImage(pageData, 'JPEG', 0, currentHeight, imgWidth, imgHeight);
currentHeight += imgHeight;
}
} }
} else {
pdf.addImage(pageData, 'JPEG', 0, currentHeight, imgWidth, imgHeight);
currentHeight += imgHeight;
}
} }
}
pdf.save(name.replace(" ", "_") + '.pdf'); pdf.save(name.replace(" ", "_") + '.pdf');
} }
export function windowPrint(id, zoom) { export function windowPrint(id, zoom) {
//根据div标签ID拿到div中的局部内容 //根据div标签ID拿到div中的局部内容
let bdhtml = window.document.body.innerHTML; let bdhtml = window.document.body.innerHTML;
let el = document.getElementById(id); let el = document.getElementById(id);
var jubuData = el.innerHTML; var jubuData = el.innerHTML;
document.getElementsByTagName('body')[0].style.zoom = zoom; document.getElementsByTagName('body')[0].style.zoom = zoom;
//把获取的 局部div内容赋给body标签, 相当于重置了 body里的内容 //把获取的 局部div内容赋给body标签, 相当于重置了 body里的内容
window.document.body.innerHTML = jubuData; window.document.body.innerHTML = jubuData;
//调用打印功能 //调用打印功能
window.print(); window.print();
window.document.body.innerHTML = bdhtml;//重新给页面内容赋值; window.document.body.innerHTML = bdhtml;//重新给页面内容赋值;
return false; return false;
} }
export function getBodyUploadFiles(obj, runData) { export function getBodyUploadFiles(obj, runData) {
let bodyUploadFiles = []; let bodyUploadFiles = [];
obj.bodyUploadIds = []; obj.bodyUploadIds = [];
if (runData) { if (runData) {
if (runData instanceof Array) { if (runData instanceof Array) {
runData.forEach(request => { runData.forEach(request => {
_getBodyUploadFiles(request, bodyUploadFiles, obj); _getBodyUploadFiles(request, bodyUploadFiles, obj);
}); });
} else { } else {
_getBodyUploadFiles(runData, bodyUploadFiles, obj); _getBodyUploadFiles(runData, bodyUploadFiles, obj);
}
} }
} return bodyUploadFiles;
return bodyUploadFiles;
} }
export function _getBodyUploadFiles(request, bodyUploadFiles, obj) { export function _getBodyUploadFiles(request, bodyUploadFiles, obj) {
let body = null; let body = null;
if (request.hashTree && request.hashTree.length > 0 && request.hashTree[0].body) { if (request.hashTree && request.hashTree.length > 0 && request.hashTree[0].body) {
body = request.hashTree[0].body; body = request.hashTree[0].body;
} else if (request.body) { } else if (request.body) {
body = request.body; body = request.body;
}
if (body) {
if (body.kvs) {
body.kvs.forEach(param => {
if (param.files) {
param.files.forEach(item => {
if (item.file) {
if (!item.id) {
let fileId = getUUID().substring(0, 12);
item.name = item.file.name;
item.id = fileId;
}
obj.bodyUploadIds.push(item.id);
bodyUploadFiles.push(item.file);
}
});
}
});
} }
if (body.binary) { if (body) {
body.binary.forEach(param => { if (body.kvs) {
if (param.files) { body.kvs.forEach(param => {
param.files.forEach(item => { if (param.files) {
if (item.file) { param.files.forEach(item => {
if (!item.id) { if (item.file) {
let fileId = getUUID().substring(0, 12); if (!item.id) {
item.name = item.file.name; let fileId = getUUID().substring(0, 12);
item.id = fileId; item.name = item.file.name;
} item.id = fileId;
obj.bodyUploadIds.push(item.id); }
bodyUploadFiles.push(item.file); obj.bodyUploadIds.push(item.id);
} bodyUploadFiles.push(item.file);
}); }
});
}
});
}
if (body.binary) {
body.binary.forEach(param => {
if (param.files) {
param.files.forEach(item => {
if (item.file) {
if (!item.id) {
let fileId = getUUID().substring(0, 12);
item.name = item.file.name;
item.id = fileId;
}
obj.bodyUploadIds.push(item.id);
bodyUploadFiles.push(item.file);
}
});
}
});
} }
});
} }
}
} }
export function handleCtrlSEvent(event, func) { export function handleCtrlSEvent(event, func) {
if (event.keyCode === 83 && event.ctrlKey) { if (event.keyCode === 83 && event.ctrlKey) {
// console.log('拦截到 ctrl + s');//ctrl+s // console.log('拦截到 ctrl + s');//ctrl+s
func(); func();
event.preventDefault(); event.preventDefault();
event.returnValue = false; event.returnValue = false;
return false; return false;
} }
} }
export function strMapToObj(strMap) { export function strMapToObj(strMap) {
if (strMap) { if (strMap) {
let obj = Object.create(null); let obj = Object.create(null);
for (let [k, v] of strMap) { for (let [k, v] of strMap) {
obj[k] = v; obj[k] = v;
}
return obj;
} }
return obj; return null;
}
return null;
} }
export function objToStrMap(obj) { export function objToStrMap(obj) {
let strMap = new Map(); let strMap = new Map();
for (let k of Object.keys(obj)) { for (let k of Object.keys(obj)) {
strMap.set(k, obj[k]); strMap.set(k, obj[k]);
} }
return strMap; return strMap;
} }
export function getColor() { export function getColor() {
return localStorage.getItem('color'); return localStorage.getItem('color');
} }
export function setColor(a, b, c, d) { export function setColor(a, b, c, d) {
document.body.style.setProperty('--color', a); document.body.style.setProperty('--color', a);
document.body.style.setProperty('--color_shallow', b); document.body.style.setProperty('--color_shallow', b);
document.body.style.setProperty('--count_number', c); document.body.style.setProperty('--count_number', c);
document.body.style.setProperty('--count_number_shallow', d); document.body.style.setProperty('--count_number_shallow', d);
} }
export function setOriginColor() { export function setOriginColor() {
setColor(ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER, COUNT_NUMBER_SHALLOW); setColor(ORIGIN_COLOR, ORIGIN_COLOR_SHALLOW, COUNT_NUMBER, COUNT_NUMBER_SHALLOW);
}
export function publicKeyEncrypt(input, publicKey) {
let jsencrypt = new JSEncrypt({default_key_size: 1024});
jsencrypt.setPublicKey(publicKey);
return jsencrypt.encrypt(input);
} }

View File

@ -55,7 +55,7 @@
</template> </template>
<script> <script>
import {saveLocalStorage} from '@/common/js/utils'; import {publicKeyEncrypt, saveLocalStorage} from '@/common/js/utils';
import {DEFAULT_LANGUAGE} from "@/common/js/constants"; import {DEFAULT_LANGUAGE} from "@/common/js/constants";
const requireComponent = require.context('@/business/components/xpack/', true, /\.vue$/); const requireComponent = require.context('@/business/components/xpack/', true, /\.vue$/);
@ -103,6 +103,8 @@ export default {
if (!response.data.success) { if (!response.data.success) {
this.ready = true; this.ready = true;
//
localStorage.setItem("publicKey", response.data.message);
} else { } else {
let user = response.data.data; let user = response.data.data;
saveLocalStorage(response.data); saveLocalStorage(response.data);
@ -159,7 +161,15 @@ export default {
}); });
}, },
doLogin() { doLogin() {
this.result = this.$post(this.loginUrl, this.form, response => { let publicKey = localStorage.getItem("publicKey");
let form = {
username: publicKeyEncrypt(this.form.username, publicKey),
password: publicKeyEncrypt(this.form.password, publicKey),
authenticate: this.form.authenticate
};
this.result = this.$post(this.loginUrl, form, response => {
saveLocalStorage(response); saveLocalStorage(response);
sessionStorage.setItem('loginSuccess', 'true'); sessionStorage.setItem('loginSuccess', 'true');
this.getLanguage(response.data.language); this.getLanguage(response.data.language);