如何使用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);
     }
 }