Я написал свой собственный локальный аутентификатор. Когда я использовал его, lastLoginTime не обновляется. Регистрация с базовым аутентификатором в порядке.
Какое расширение отвечает за обновление lastLoginTime? Что мне нужно сделать в моем аутентификаторе, чтобы обновить lastLoginTime? Спасибо!
Обновлять: Я создал собственный аутентификатор для использования с учетными данными пользователя, которые аутентификатор получает из XML-подписи. Аутентификатор получает XML, проверяет подпись, извлекает special_user_id, а затем проверяет этот идентификатор в UserStroe в пользовательском утверждении. Если пользователь с этим значением утверждения существует, то аутентификатор получает user_name из хранилища пользователей и успешно завершает processAuthenticationResponse().
Суммируя
processAuthenticationResponse() {
...
String[] logins = userStoreManager.getUserList("http://wso2.org/claims/special_user_id", specialUserIdValue, "default");
context.setSubject(AuthenticatedUser.createLocalAuthenticatedUserFromSubjectIdentifier(logins[0]));
}
В IS-5.10.0 время последнего входа в систему обновляется только в том случае, если функция приостановки простоя пользователя https://is.docs.wso2.com/en/5.10.0/learn/user-account-suspension/ включена. включено.
IS-5.10.0 содержит компонент управления идентификацией версии 1.4.1. Вот строки кода, связанные с обновлением времени последнего входа в систему https://github.com/wso2-extensions/identity-governance/blob/57e510a61dc9042b55ffa0cbdceb13f508519f3a/components/org.wso2.carbon.identity.account.suspension.notification. task/src/main/java/org/wso2/carbon/identity/account/suspension/notification/task/handler/AccountSuspensionNotificationHandler.java#L84-L85
Неважно, используете ли вы базовый аутентификатор или настраиваемый аутентификатор. Если вы включили функцию приостановки учетной записи пользователя в режиме ожидания, при каждом событии POST_AUTHENTICATION
следует вызывать событие handleEvent этого AccountSuspensionNotificationHandler и обновлять время последнего входа в систему.
ПРИМЕЧАНИЕ. В IS-5.11.0 изменена логика обновления значения времени последнего входа в систему. Его можно обновить независимо от функции приостановки учетной записи неактивного пользователя. Проверяйте https://github.com/wso2/product-is/issues/4515
Обновлять:
POST_AUTHENTICATION
не срабатывает при использовании пользовательского аутентификатора.После аутентификации в пользовательском магазине https://github.com/wso2/carbon-kernel/blob/56d068221ab46e205d5b7188e2bc55134bfc08a9/core/org.wso2.carbon.user.core/src/main/java/org/wso2/carbon/ user/core/common/AbstractUserStoreManager.java#L1757 вызывается настроенный метод слушателей doPostAuthenticate
.
Событие POST_AUTHENTICATION
запускается методом IdentityMgtEventListener
, doPostAuthenticate
https://github.com/wso2-extensions/identity-governance/blob/57e510a61dc9042b55ffa0cbdceb13f508519f3a/components/org.wso2.carbon.identity.governance/src/main/ java/org/wso2/carbon/identity/governance/listener/IdentityMgtEventListener.java#L122-L127
POST_AUTHENTICATION
не запускается.Возможные варианты запуска события POST_AUTHENTICATION
из пользовательского аутентификатора.
public AuthenticatorFlowStatus process(HttpServletRequest request, HttpServletResponse response, AuthenticationContext context) throws AuthenticationFailedException, LogoutFailedException {
на пользовательский аутентификатор с той же логикой, что и в методе AbstractApplicationAuthenticator
. Затем добавьтеfireEvent(context, IdentityEventConstants.Event.POST_AUTHENTICATION, true);
до
return AuthenticatorFlowStatus.SUCCESS_COMPLETED;
AbstractLocalApplicationAuthenticator
вместо AbstractApplicationAuthenticator
. Обратите внимание, что в этих двух классах существуют различия в методе процесса аутентификации.Какому руководству вы следовали, чтобы написать собственный аутентификатор? Это пользовательский локальный аутентификатор или федеративный аутентификатор? Какой абстрактный аутентификатор вы расширили?
Это руководство: is.docs.wso2.com/en/latest/references/extend/federation/… extends AbstractApplicationAuthenticator реализует метод LocalApplicationAuthenticator, processAuthenticationResponse завершен без ошибок. Я не использую userStoreManager.authenticate
Проверьте раздел «обновление» опубликованного ответа, чтобы увидеть причину, по которой событие POST_AUTHENTICATION не вызывается в вашем случае, и возможное решение.
Однако у меня есть сомнения по поводу управления пользователями в вашей настройке. Согласно комментариям, вы не аутентифицируете пользователей через менеджер хранилища пользователей, но поддерживаете пользователей в хранилище пользователей для управления списком пользователей/профилем. По какой причине не используется userStoreManager.authenticate?
Большое спасибо! Я думаю, это то, что мне нужно. Я создал собственный аутентификатор для использования с учетными данными пользователя, которые аутентификатор получает из XML-подписи. Аутентификатор получает XML, проверяет подпись, извлекает special_user_id, а затем проверяет этот идентификатор в UserStroe в пользовательском утверждении. Если пользователь с этим значением утверждения существует, то аутентификатор получает user_name из хранилища пользователей и успешно завершает processAuthenticationResponse().
Добавлено обновление к вопросу.
Спасибо! Да, функция блокировки пользователя включена. Когда я вошел в систему с пользователем и паролем, время последнего входа в систему обновляется. Все работает. Но с пользовательским аутентификатором событие POST_AUTHENTICATION не запускается. Как вызвать событие POST_AUTHENTICATION?