Keycloak: пользовательская почта ExecuteAction, возможно ли получить пользовательский атрибут? - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь отправить пользовательское письмо своему пользователю Keycloak, перебрав почтовый шаблон executeAction для keycloak.

Я создал:

../myProject/email/text/executeAction.ftl
../myProject/email/messages/messages_fr.properties
../myProject/email/html/executeAction.ftl

Я уже получил письмо, работающее с этим html / executeAction.ftl:

${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),user.getAttributes())}

Так что я знаю, что у меня хорошая конфигурация. Проблема с приведенным выше примером заключается в том, что я показываю список пользовательских атрибутов, когда я хочу получить только один:

пол = мистер или пол = миссис

Я попытался использовать функцию, которую видел там: https://github.com/keycloak/keycloak/blob/4.5.0.Final/server-spi/src/main/java/org/keycloak/models/UserModel.java

, которые дают следующее:

<#assign gender= user.getAttributes(gender)/>

${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),gender)}

Я ожидал получить письмо с указанием пола пользователя, но письмо не отправлено:

У меня следующая ошибка:

ERROR [org.keycloak.services] (default task-1) KC-SERVICES0029: Failed to send email: javax.mail.MessagingException: IOException while sending message;
      nested exception is:
        java.io.IOException: Exception writing Multipart
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1308)
        at org.keycloak.email.DefaultEmailSenderProvider.send(DefaultEmailSenderProvider.java:142)
        at org.keycloak.email.freemarker.FreeMarkerEmailTemplateProvider.send(FreeMarkerEmailTemplateProvider.java:251)

.......
Caused by: java.io.IOException: Exception writing Multipart
        at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:83)
        at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:897)
        at javax.activation.DataHandler.writeTo(DataHandler.java:330)
        at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1652)
        at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1850)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1259)
        ... 84 more
Caused by: javax.mail.MessagingException: Empty multipart: multipart/alternative; 
    boundary="----=_Part_0_165447285.1560929205027"
    at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:548)
    at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:81)
    ... 89 more

Я не понимаю, что именно идет не так: Мой ftl плох? Я не эксперт, но из того, что я увидел, должно быть все в порядке. Похоже, что Keycloak пытается отправить письмо, так почему же вдруг происходит сбой, когда я пытаюсь использовать один атрибут вместо полного списка?

Другим вариантом может быть использование некоторого регулярного выражения в .ftl для извлечения пола, но я не знаю, возможно ли это?

Редактировать: Хорошо, после многих проб и ошибок я узнал, как это сделать:

Я полагаю, что мое отсутствие знаний о FTL является проблемой. Я получил это, сделав это:

<#assign attributes = user.getAttributes()>
<#assign civilite = attributes.civilite?capitalize>
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),civilite)}

Понятия не имею, почему мне нужно было отбросить часть $ {} или почему вы получили бы значение в HashMap>, используя attribute.key вместо использования метода получения, но хорошо, что это работает ...

1 Ответ

0 голосов
/ 19 июня 2019

Хорошо, после многих проб и ошибок я узнал, как это сделать:

Полагаю, проблема заключается в недостатке знаний о FTL. Я получил это, сделав это:

<#assign attributes = user.getAttributes()>
<#assign civilite = attributes.civilite?capitalize>
${msg("executeActionsBody",link, linkExpiration, realmName, requiredActionsText, linkExpirationFormatter(linkExpiration),user.getFirstName(),user.getLastName(),user.getUsername(),civilite)}

Я понятия не имею, почему мне нужно было отбросить часть $ {} или почему вы получили бы значение в HashMap>, используя attribute.key вместо использования метода получения, но хорошо, что это работает ...

...