Как распространять токены безопасности WebSphere при вызове HTTP из EJB

У меня есть EJB, который делает вызов на другой сервер в ячейке, используя HTTP (REST API).

В контексте EJB пользователь уже аутентифицирован и авторизован, как я могу распространить токены безопасности на другой сервер, избегая необходимости предоставлять учетные данные в запросе?

2 ответа

Решение

Можно получить WebSphere's Ltpa знак безопасности subject и передать его как cookie для вызова HTTP:

public static SingleSignonToken getSSOTokenFromSubject(final Subject subject) {
    if (subject == null) {
        return null;
    }
    return AccessController.doPrivileged(new PrivilegedAction<SingleSignonToken>() {
        public SingleSignonToken run() {
            Set<SingleSignonToken> ssoTokens = subject.getPrivateCredentials(SingleSignonToken.class);
                for (SingleSignonToken ssoToken : ssoTokens) {
                if (ssoToken.getName().equals("LtpaToken")) {
                    return ssoToken;
                }
            }

            return null;
        }
    });
}

// Get cookie to add to outgoing HTTP requests
SingleSignonToken ssoToken =  getSSOTokenFromSubject(subject);

String ssoTokenStr = null;
if (ssoToken != null) {
    byte[] ssoTokenBytes = ssoToken.getBytes();
    ssoTokenStr = com.ibm.ws.util.Base64.encode(ssoTokenBytes);
}
String ssoTokenCookie = "LtpaToken2=" + ssoTokenStr;

Добавляя ssoTokenCookie Для запроса куки-файлов не нужно указывать учетные данные пользователя провайдера.

Cookie ltpaCookie = WebSecurityHelper.getSSOCookieFromSSOToken();

Извлекает токен SSO из темы текущего потока и создает из него cookie-файл SSO для использования в последующих веб-вызовах. В основном то, что делает весь код в посте ниже. Этот метод доступен из WAS 8.x, я полагаю.

В качестве ссылки для компиляции необходим следующий Jar-файл: com.ibm.ws.admin.client-8.5.0.jar
(Я использую WAS 8.5.5.11 для этого примера)

Другие вопросы по тегам