Как использовать информацию в токене 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(зашифрованный текст); }}
Другие вопросы по тегам