IBM MobileFirst Platform Foundation 7 — Аутентификация адаптера — Обновление атрибутов удостоверения пользователя

Я использую аутентификацию на основе адаптера для защиты ресурсов, а также для управления всей логикой аутентификации (проверка учетных данных). Если проверка пользователя/пароля прошла успешно, вызывается метод WL.Server.setActiveUser для создания аутентифицированного сеанса для Realm с данными пользователя, хранящимися в объекте userIdentity.

Процесс проверки пользователя/пароля возвращает OK/Fail, а также файл cookie, если проверка прошла успешно. И этот файл cookie должен быть отправлен при следующих вызовах адаптера, поэтому я также добавляю его в объект данных userIdentity. Моя идея заключалась в том, чтобы сохранить его в объекте userIdentity, поскольку его можно получить на других адаптерах (var userIdentity = WL.Server.getActiveUser();) для добавления значения cookie в заголовок запроса адаптера, и он работает правильно!

В чем проблема? Ответ адаптера может содержать новое значение для этого файла cookie, поэтому я должен обновить объект userIdentity, чтобы заменить старое значение файла cookie новым значением. Тем не менее, объект userIdentity является неизменяемым, поэтому он всегда содержит исходный файл cookie, полученный процессом входа в систему.

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

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

Большое спасибо! Серги

PS: есть вопрос, который пытается решить эту проблему, но возможный ответ мне не подходит (IBM MobileFirst Platform Foundation 6.3: Можем ли мы изменить пользовательские атрибуты объекта идентификации пользователя [MobileFirst Session]): я попробовал следующий код для обновления userIdentity:

var newUserIdentity = {
        userId: userIdentity.userId, 
        attributes: {
            cookies: newValue
        }
};
WL.Server.setActiveUser(realm, null);
WL.Server.setActiveUser(realm, newUserIdentity);

Но когда оно получено от другого адаптера (var userIdentity = WL.Server.getActiveUser()), оно содержит исходное значение!


comment
Почему связанный вопрос недействителен для вас?   -  person Nathan H    schedule 09.09.2015
comment
К вопросу добавлено пояснение.   -  person sergi    schedule 09.09.2015
comment
Я пытался управлять файлом cookie напрямую, но безуспешно stackoverflow.com/questions/28753979/   -  person xverges    schedule 09.09.2015


Ответы (1)


  1. Вы можете удалить userIdentity (WL.Server.setActiveUser("realm", null);), а затем установить новый активный пользовательский объект.

  2. Если вы можете зависеть от сеансов HTTP (один сервер или фиксированные сеансы), вы можете получить доступ к объекту сеанса и сохранить все, что хотите. (WL.Server.getClientRequest().getSession())

  3. Если вы не хотите использовать сеансы HTTP, вы можете использовать внешний механизм хранения, такой как SQL или Cloudant, для хранения этой информации. В качестве идентификатора можно использовать Client-ID (см. пример https://ibm.biz/BdXUHt).

person Nathan H    schedule 09.09.2015
comment
Спасибо Натан! 1) Мне кажется, это не работает, я добавил код, который использовал для проверки, в конце моего вопроса. 2) Можете поделиться ссылкой на образец? Вы имеете в виду сделать каждый вызов адаптера, используя класс org.apache.http.client.methods.HttpGet? Я хотел, чтобы адаптеры были простыми, используя WL.Server.invokeHttp(input). 3) Я надеюсь, что предыдущие варианты не позволяют использовать внешний механизм хранения. - person sergi; 09.09.2015
comment
У меня нет образца для (2), но вы можете получить объект сеанса, используя WL.Server.getClientRequest().getSession(), а затем на этом объекте вы можете сделать setAttribute и getAttribute. - person Nathan H; 09.09.2015
comment
Спасибо, попробую это решение! - person sergi; 09.09.2015
comment
Спасибо, Натан. Объект HTTP Session решил мою проблему. - person sergi; 21.09.2015