Как распространять токены безопасности 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 для этого примера)