Как использовать информацию в токене LTPA
Рассмотрим следующую настройку:
- Веб-приложение, развернутое на сервере приложений Websphere (6.1, если это важно)
- приложение будет доступно через обратный прокси-сервер webseal
- webseal заботится об аутентификации и передает маркер LTPA как признак действительной аутентификации
Если я правильно понял, токен LTPA содержит такую информацию, как имя пользователя, роли и так далее.
Вопрос: как мне получить доступ к этой информации с токена LTPA в моем веб-приложении на Java?
2 ответа
У вас нет прямого доступа к токену LTPA, скорее вы предполагаете, что WebSphere установил для вас контекст безопасности на основе своих процедур аутентификации.
Вы можете использовать
getUserPrincipal()
на вашем объекте HttpServletRequest для доступа к личности пользователя.
Роли специфичны для текущего ресурса (serlvet, ejb...) и, следовательно, вы используете метод HttpServletRequest
isUserInRole()
определить, находится ли пользователь в роли.
Вы также можете использовать метод
public static javax.security.auth.Subject getCallerSubject()
получить дополнительную информацию о безопасности, включая членство в группах.
Просмотр токенов LTPA отлично подходит для отладки, мы используем это много. Вам понадобится ключ ltpa и пароль, чтобы это работало
/* Уведомление об авторском праве # Copyright (C) 2007, Cosmin Stejerean (http://www.offbytwo.com) # # Вы можете использовать этот код в соответствии с условиями лицензии Creative Commons Attribution #, доступной по адресу 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 сам зашифрован с использованием хеш-значения SHA пароля LTPA (с дополнением от 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+......"; try { LtpaDecoder t = new LtpaDecoder(tokenCipher); System.out.println("UserInfo: " + t.getUserInfo()); System.out.println("Expiry: " + t.getExpiryDate()); System.out.println("Полный токен: " + t.getFullToken()); } catch(Exception e) { e.printStackTrace(); } } public LtpaDecoder(String fulltoken) создает исключение { 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(токен, "%"); sUserInfo = st.nextToken(); String sExpires = st.nextToken(); sSignature = st.nextToken(); dExpiry = новая дата (Long.parseLong(sExpires)); sFullToken = токен; } public String getSignature() { return sSignature; } public String getFullToken() { return sFullToken; } public String getUserInfo() { return sUserInfo; } public String getExpiryDate() { SimpleDateFormat sdf = new SimpleDateFormat("гггг-ММ-дд ЧЧ: мм: сс z"); вернуть sdf.format(dExpiry); } private byte[] getSecretKey(String shared3DES, String password) создает исключение { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(password.getBytes()); byte[] hash3DES = новый байт [24]; System.arraycopy(md.digest(), 0, hash3DES, 0, 20); Arrays.fill(hash3DES, 20, 24, (byte) 0); // расшифровываем реальный ключ и возвращаем его BASE64Decoder base64decoder = new BASE64Decoder(); возврат расшифровать (base64decoder.decodeBuffer(shared3DES), hash3DES); } public byte[] decryptLtpaToken(String encryptedLtpaToken, byte[] key) выдает исключение { BASE64Decoder base64decoder = new BASE64Decoder(); final byte[] ltpaByteArray = base64decoder.decodeBuffer(encryptedLtpaToken); возврат расшифровать (ltpaByteArray, ключ); } public byte[] decrypt(byte[] ciphertext, byte[] key) выдает исключение { final Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); окончательный KeySpec keySpec = new DESedeKeySpec(key); окончательный ключ secretKey = SecretKeyFactory.getInstance("TripleDES").generateSecret(keySpec); cipher.init(Cipher.DECRYPT_MODE, secretKey); вернуть cipher.doFinal(зашифрованный текст); }}