如何使用LTPA令牌中的信息
请考虑以下设置:
- 部署在Websphere Application Server上的Web应用程序(如果重要,则为6.1)
- 该应用程序将通过webseal反向代理访问
- webseal负责身份validation并传递LTPA令牌作为有效身份validation的标志
如果我做对了,LTPA令牌包含用户名,角色等信息。
问题:如何从我的Java Web应用程序中的LTPA令牌访问此信息?
您不直接访问LTPA令牌,而是假设WebSphere已根据其身份validation过程为您建立了安全上下文。
然后你可以使用
getUserPrincipal()
在您的HttpServletRequest对象上访问用户的身份。
角色特定于当前资源(serlvet,ejb …),因此您使用HttpServletRequest方法
isUserInRole()
确定用户是否在角色中。
您也可以使用该方法
public static javax.security.auth.Subject getCallerSubject()
获得进一步的安全信息,包括组成员资格
查看LTPA令牌非常适合调试,我们使用这个很多。 你需要使用ltpa-key和密码才能工作
/* 版权声明 #Copmin Stejerean版权所有(C)2007(http://www.offbytwo.com) # #您可以根据知识共享署名许可条款使用此代码 #可从http://creativecommons.org/licenses/by/3.0/获取 #只要您包含以下通知'包括来自Cosmin Stejerean(http://www.offbytwo.com)的代码' * / import java.security.Key; import java.security.MessageDigest; import java.security.spec.KeySpec; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.StringTokenizer; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import sun.misc.BASE64Decoder; //共享3DES密钥本身使用LTPA密码的SHA哈希值加密(用0x0填充,最多24个字节)。 公共类LtpaDecoder { private String ltpa3DESKey =“JvJRzwdhKk6o40FuATa9acKD2uaXswVHlUsn2c2 + MKQ =”; private String ltpaPassword =“secretpassword”; private String sUserInfo =“”; 私人日期dExpiry; private String sFullToken =“”; private String sSignature =“”; public static void main(String [] args) { String tokenCipher =“vsof5exb990sb2r5hRJ + bneCnmBTuLQ3XF + ......”; 尝试{ LtpaDecoder t = new LtpaDecoder(tokenCipher); System.out.println(“UserInfo:”+ t.getUserInfo()); System.out.println(“Expiry:”+ t.getExpiryDate()); System.out.println(“Full token:”+ t.getFullToken()); } catch(例外e){ e.printStackTrace(); } } public LtpaDecoder(String fulltoken)抛出exception{ byte [] secretKey = getSecretKey(this.ltpa3DESKey,this.ltpaPassword); String ltpaPlaintext = new String(decryptLtpaToken(fulltoken,secretKey)); extractTokenData(ltpaPlaintext); } private void extractTokenData(String token) { 的System.out.println( “\ n”); StringTokenizer st = new StringTokenizer(token,“%”); sUserInfo = st.nextToken(); String sExpires = st.nextToken(); sSignature = st.nextToken(); dExpiry =新日期(Long.parseLong(sExpires)); sFullToken =令牌; } public String getSignature(){ return sSignature; } public String getFullToken(){ 返回sFullToken; } public String getUserInfo(){ return sUserInfo; } public String getExpiryDate(){ SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss z”); return sdf.format(dExpiry); } private byte [] getSecretKey(String shared3DES,String password)抛出exception { MessageDigest md = MessageDigest.getInstance(“SHA”); md.update(password.getBytes()); byte [] hash3DES = new byte [24]; System.arraycopy(md.digest(),0,hash3DES,0,20); Arrays.fill(hash3DES,20,24,(byte)0); //解密真实密钥并将其返回 BASE64Decoder base64decoder = new BASE64Decoder(); return decrypt(base64decoder.decodeBuffer(shared3DES),hash3DES); } public byte [] decryptLtpaToken(String encryptedLtpaToken,byte [] key)抛出exception { BASE64Decoder base64decoder = new BASE64Decoder(); final byte [] ltpaByteArray = base64decoder.decodeBuffer(encryptedLtpaToken); return decrypt(ltpaByteArray,key); } public byte [] decrypt(byte [] ciphertext,byte [] key)抛出Exception { final Cipher cipher = Cipher.getInstance(“DESede / ECB / PKCS5Padding”); final KeySpec keySpec = new DESedeKeySpec(key); final Key secretKey = SecretKeyFactory.getInstance(“TripleDES”)。generateSecret(keySpec); cipher.init(Cipher.DECRYPT_MODE,secretKey); return cipher.doFinal(ciphertext); } }