Отказ от ответственности : Это не легко, и я не проверял это. Я только что декомпилировал обработчик аутентификации SAML и проверил, что там происходит.
Вы должны знать, что вы делаете, и вы должны постараться сделать его максимально надежным. В общем, работа с API-интерфейсами, связанными с аутентификацией в AEM, довольно громоздка.
Я не думаю, что вы сможете получить такую информацию, как отдел и т. Д., Со "стандартного" токена SAML. Но давайте предположим, что это часть полезной нагрузки токенов.
Вам придется где-то хранить эту информацию. Вероятно, профиль пользователя (например, /home/users/a/<userid>/profile
).
Я бы подумал, что это возможно с org.apache.sling.auth.core.spi.AuthenticationFeedbackHandler
. Этот обработчик будет иметь доступ к запросу, ответу и информации аутентификации пользователя. Таким образом, вы должны реализовать такой обработчик, который затем будет вызываться после аутентификации пользователя.
Информация аутентификации - это в основном просто карта, которая содержит ключи с соответствующей информацией. Один такой ключ должен быть user.jcr.credentials
. Для SAML это должен быть экземпляр com.adobe.granite.auth.saml.extidp.SamlCredentials
.
Эти учетные данные содержат «атрибуты», которые вы можете прочитать через getAttribute()
. Атрибут, который содержит «необработанный ответ SAML», называется samlResponse
. Так что это должно дать вам то, что вы ищете:
private String getSamlResponse(final AuthenticationInfo authenticationInfo) {
if (authenticationInfo == null) {
return "";
}
Object credentialsObject = authenticationInfo.get("user.jcr.credentials");
if (credentialsObject == null) {
return "";
}
try {
SamlCredentials credentials = (SamlCredentials) credentialsObject;
String encryptedSamlResponse = credentials.getAttribute("samlResponse");
if (encryptedSamlResponse == null || encryptedSamlResponse.trim().length() == 0) {
return "";
}
return decryptSamlResponse(encryptedSamlResponse);
} catch (ClassCastException e) {
// Unable to cast "credentialsObject" to "SamlCredentials"
return "";
}
}
Примечание:
- В приведенном выше коде используется
SamlCredentials
. Этот класс публично не экспортируется пакетом com.adobe.granite.auth.saml
. Вы должны декомпилировать пакет, скопировать и вставить этот класс в свой собственный пакет. - Вы должны реализовать метод
decryptSamlResponse
, используя CryptoSupport .
Если токен SAML не содержит информацию, которую вы ищете, вы можете попытаться использовать адрес электронной почты пользователя для запроса какой-либо внешней базы данных, содержащей информацию, и затем сохранить ее в профиле пользователя.
Что бы вы ни делали, если вы делаете это на издателе, и у вас есть несколько издателей (как вы обычно должны это иметь), вам также придется подумать о синхронизации профиля пользователя между этими издателями или использовать липкое соединение. Насколько я могу судить, синхронизация является своего рода ошибкой и имеет несколько проблем, и вы можете столкнуться с ситуациями, когда первый запрос отправляется издателю 1, следующий запрос (вскоре после этого) отправляется издателю 2, у которого еще нет синхронизированного профиля. ,Вероятно, лучше использовать липкие соединения.