E8電腦端單點(diǎn)登錄總結(jié)
本文章主要在于解釋泛微Ecology8版本中如果單點(diǎn)進(jìn)入系統(tǒng)。
首先,系統(tǒng)標(biāo)準(zhǔn)的單點(diǎn)進(jìn)入需要有OA的登錄賬號(hào)、不論OA自身還是其它系統(tǒng)訪問OA都需要有對(duì)應(yīng)的賬號(hào)或者其它唯一對(duì)應(yīng)關(guān)系。
再有,系統(tǒng)中的VerifySSoLogin.jsp只支持loginid的對(duì)應(yīng),即不論異構(gòu)系統(tǒng)中哪個(gè)字段對(duì)應(yīng)OA的登錄賬號(hào),但OA中按照l(shuí)oginid字段處理。
如果異構(gòu)系統(tǒng)與OA的人員對(duì)應(yīng)關(guān)系不是以O(shè)A中的loginid對(duì)應(yīng)的,請(qǐng)按照【如果對(duì)應(yīng)關(guān)系不是loginid】目錄中的內(nèi)容自行開發(fā)驗(yàn)證登錄頁(yè)。
VerifySSoLogin.jsp總體邏輯
/login/VerifySSoLogin.jsp?para=XXX
para詳解
通過下圖我們可以得到如下信息:
1.該jsp中接受para參數(shù)
2.從配置文件取出pwd參數(shù)(密鑰)
3.AES解密para參數(shù)
4.分隔出gopage和loginid

image.png
嘗試寫一個(gè)可以單點(diǎn)進(jìn)入OA的jsp
示例代碼
<%@page language="java" contentType="text/html; charset=UTF-8"%>
<%@page import="weaver.general.AES"%>
<%@page import="weaver.general.BaseBean"%>
<%
try {
//獲取AES加密Key
String pwd = new BaseBean().getPropValue("AESpassword", "pwd");
//要訪問OA具體頁(yè)面的地址
String gopage = "/wui/main.jsp";
//OA的登錄賬號(hào)
String loginid = "llh";
//拼接成一個(gè)字符串
String url = gopage + "#" + loginid;
//加密成para參數(shù)
String para = AES.encrypt(url, pwd);
//訪問OA的具體地址
response.sendRedirect("/login/VerifySSoLogin.jsp?para=" + para);
} catch (Exception e) {
new BaseBean().writeLog(e);
response.sendRedirect("/login/Login.jsp");
return;
}
%>
如果對(duì)應(yīng)關(guān)系不是loginid
請(qǐng)新建一個(gè)jsp,參照/login/VerifySSoLogin.jsp 重寫一個(gè)jsp頁(yè)面,修改查詢?nèi)藛Tsql(如下圖所示)。

1586245211(1).jpg
第三方用到AES加密類
將加密類 AES發(fā)給第三方,按照該類加密encrypt 方法加密。
請(qǐng)務(wù)必然第三方采用該類加密,否則系統(tǒng)無法解密。
AES加密解密類
該代碼為反編譯代碼,親測(cè)可以放心使用。
package weaver.general;
import com.sun.crypto.provider.SunJCE;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.security.provider.Sun;
public class AES {
static {
if (null == Security.getProvider("SunJCE")) {
Security.addProvider(new SunJCE());
}
if (null == Security.getProvider("SUN")) {
Security.addProvider(new Sun());
}
}
/**
*加密類
*paramString1 加密的字符串
*paramString2 加密key
**/
public static String encrypt(String paramString1, String paramString2) {
byte[] arrayOfByte1 = null;
try {
KeyGenerator localKeyGenerator = KeyGenerator.getInstance("AES");
SecureRandom localSecureRandom = SecureRandom.getInstance("SHA1PRNG");
localSecureRandom.setSeed(paramString2.getBytes());
localKeyGenerator.init(128, localSecureRandom);
SecretKey localSecretKey = localKeyGenerator.generateKey();
byte[] arrayOfByte2 = localSecretKey.getEncoded();
SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte2, "AES");
Cipher localCipher = Cipher.getInstance("AES", "SunJCE");
byte[] arrayOfByte3 = paramString1.getBytes();
localCipher.init(1, localSecretKeySpec);
arrayOfByte1 = localCipher.doFinal(arrayOfByte3);
} catch (NoSuchProviderException localNoSuchProviderException) {
localNoSuchProviderException.printStackTrace();
} catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
localNoSuchAlgorithmException.printStackTrace();
} catch (NoSuchPaddingException localNoSuchPaddingException) {
localNoSuchPaddingException.printStackTrace();
} catch (InvalidKeyException localInvalidKeyException) {
localInvalidKeyException.printStackTrace();
} catch (IllegalBlockSizeException localIllegalBlockSizeException) {
localIllegalBlockSizeException.printStackTrace();
} catch (BadPaddingException localBadPaddingException) {
localBadPaddingException.printStackTrace();
}
return arrayOfByte1 == null ? "" : parseByte2HexStr(arrayOfByte1);
}
public static String decrypt(String paramString1, String paramString2) {
byte[] arrayOfByte1 = null;
byte[] arrayOfByte2 = parseHexStr2Byte(paramString1);
try {
KeyGenerator localKeyGenerator = KeyGenerator.getInstance("AES");
SecureRandom localSecureRandom = SecureRandom.getInstance("SHA1PRNG");
localSecureRandom.setSeed(paramString2.getBytes());
localKeyGenerator.init(128, localSecureRandom);
SecretKey localSecretKey = localKeyGenerator.generateKey();
byte[] arrayOfByte3 = localSecretKey.getEncoded();
SecretKeySpec localSecretKeySpec = new SecretKeySpec(arrayOfByte3, "AES");
Cipher localCipher = Cipher.getInstance("AES", "SunJCE");
localCipher.init(2, localSecretKeySpec);
arrayOfByte1 = localCipher.doFinal(arrayOfByte2);
} catch (NoSuchProviderException localNoSuchProviderException) {
localNoSuchProviderException.printStackTrace();
} catch (NoSuchAlgorithmException localNoSuchAlgorithmException) {
localNoSuchAlgorithmException.printStackTrace();
} catch (NoSuchPaddingException localNoSuchPaddingException) {
localNoSuchPaddingException.printStackTrace();
} catch (InvalidKeyException localInvalidKeyException) {
localInvalidKeyException.printStackTrace();
} catch (IllegalBlockSizeException localIllegalBlockSizeException) {
localIllegalBlockSizeException.printStackTrace();
} catch (BadPaddingException localBadPaddingException) {
localBadPaddingException.printStackTrace();
}
return arrayOfByte1 == null ? "" : new String(arrayOfByte1);
}
private static String parseByte2HexStr(byte[] paramArrayOfByte) {
StringBuffer localStringBuffer = new StringBuffer();
for (int i = 0; i < paramArrayOfByte.length; i++) {
String str = Integer.toHexString(paramArrayOfByte[i] & 0xFF);
if (str.length() == 1) {
str = '0' + str;
}
localStringBuffer.append(str.toUpperCase());
}
return localStringBuffer.toString();
}
private static byte[] parseHexStr2Byte(String paramString) {
if (paramString.length() < 1) {
return null;
}
byte[] arrayOfByte = new byte[paramString.length() / 2];
for (int i = 0; i < paramString.length() / 2; i++) {
int j = Integer.parseInt(paramString.substring(i * 2, i * 2 + 1), 16);
int k = Integer.parseInt(paramString.substring(i * 2 + 1, i * 2 + 2), 16);
arrayOfByte[i] = ((byte) (j * 16 + k));
}
return arrayOfByte;
}
}