次の設定を検討してください。
- Websphere Application ServerにデプロイされたWebアプリケーション(重要な場合は6.1)
- アプリは、Webシールリバースプロキシを介してアクセスされます
- Webシールが認証を処理し、有効な認証のサインとしてLTPAトークンを渡します
正しければ、LTPAトークンにはユーザー名や役割などの情報が含まれています。
質問:Java WebアプリケーションのLTPAトークンからこの情報にアクセスするにはどうすればよいですか?
次の設定を検討してください。
正しければ、LTPAトークンにはユーザー名や役割などの情報が含まれています。
質問:Java WebアプリケーションのLTPAトークンからこの情報にアクセスするにはどうすればよいですか?
LTPA トークンの内部を調べることは、デバッグに最適です。私たちはこれをよく使用します。これを機能させるには、ltpa-key とパスワードが必要です
/* 著作権表示 # Copyright (C) 2007, Cosmin Stejerean (http://www.offbytwo.com) # # このコードは、クリエイティブ コモンズ 表示 ライセンスの条件の下で自由に使用できます。 # http://creativecommons.org/licenses/by/3.0/ で入手可能 # 「Cosmin Stejerean (http://www.offbytwo.com) からのコードを含む」という通知を含める限り */ java.security.Key をインポートします。 java.security.MessageDigest をインポートします。 java.security.spec.KeySpec をインポートします。 java.sql.Date をインポートします。 import java.text.SimpleDateFormat; java.util.Arrays をインポートします。 java.util.StringTokenizer をインポートします。 javax.crypto.Cipher をインポートします。 javax.crypto.SecretKeyFactory をインポートします。 import javax.crypto.spec.DESedeKeySpec; sun.misc.BASE64Decoder をインポートします。 //共有 3DES キー自体は、LTPA パスワードの SHA ハッシュ値を使用して暗号化されます (最大 24 バイトまで 0x0 で埋められます)。 パブリック クラス LtpaDecoder { プライベート文字列 ltpa3DESKey = "JvJRzwdhKk6o40FuATa9acKD2uaXswVHlUsn2c2+MKQ="; private String ltpaPassword = "secretpassword"; プライベート文字列 sUserInfo = ""; プライベート日付 dExpiry; プライベート文字列 sFullToken = ""; プライベート文字列 sSignature = ""; public static void main(String[] args) { 文字列 tokenCipher = "vsof5exb990sb2r5hRJ+bneCnmBTuLQ3XF+......"; 試す { LtpaDecoder t = 新しい LtpaDecoder(tokenCipher); System.out.println("UserInfo: " + t.getUserInfo()); System.out.println("有効期限: " + t.getExpiryDate()); System.out.println("完全なトークン: " + t.getFullToken()); } キャッチ(例外e){ e.printStackTrace(); } } public LtpaDecoder(String fulltoken) throws Exception { byte[] secretKey = getSecretKey(this.ltpa3DESKey, this.ltpaPassword); String ltpaPlaintext = new String(decryptLtpaToken(fulltoken, secretKey)); extractTokenData(ltpaPlaintext); } private void extractTokenData(文字列トークン) { System.out.println("\n"); StringTokenizer st = new StringTokenizer(token, "%"); sUserInfo = st.nextToken(); 文字列 sExpires = st.nextToken(); sSignature = st.nextToken(); dExpiry = 新しい日付 (Long.parseLong(sExpires)); sFullToken = トークン; } public String getSignature() { sSignature を返します。 } public String getFullToken() { sFullToken を返します。 } public String getUserInfo() { 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) が例外をスローする { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(password.getBytes()); バイト[] hash3DES = 新しいバイト[24]; System.arraycopy(md.digest(), 0, hash3DES, 0, 20); Arrays.fill(hash3DES, 20, 24, (バイト) 0); // 実際の鍵を復号化して返す BASE64Decoder base64decoder = new BASE64Decoder(); 復号化を返します (base64decoder.decodeBuffer(shared3DES), hash3DES); } public byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key) が例外をスローします { BASE64Decoder base64decoder = new BASE64Decoder(); 最終バイト[] ltpaByteArray = base64decoder.decodeBuffer(encryptedLtpaToken); 復号化を返します (ltpaByteArray、キー); } public byte[] 復号化 (byte[] 暗号文、byte[] キー) は例外をスローします { 最終暗号 cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); 最終的な KeySpec keySpec = 新しい DESedeKeySpec(キー); 最終鍵 secretKey = SecretKeyFactory.getInstance("TripleDES").generateSecret(keySpec); cipher.init(Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal(暗号文); } }
LTPA トークンに直接アクセスするのではなく、WebSphere がその認証手順に基づいてセキュリティ コンテキストを確立していると想定します。
その後、使用できます
getUserPrincipal()
HttpServletRequest オブジェクトで、ユーザーの ID にアクセスします。
ロールは現在のリソース (サーベット、ejb ...) に固有であるため、HttpServletRequest メソッドを使用します。
isUserInRole()
ユーザーが役割を持っているかどうかを判断します。
メソッドを使用することもできます
public static javax.security.auth.Subject getCallerSubject()
グループ メンバーシップを含む詳細なセキュリティ情報を取得します。