Вопрос или проблема
Работаем над тем, чтобы наш деплоймент Wildfly аутентифицировался через различные поставщики LDAP. Когда мы подключаемся к Active Directory, мы видим, что роли возвращаются в верхнем регистре (например, ADMIN_ROLE), и это соответствует нашим аннотациям, которые мы предоставляем, таким как:
import jakarta.annotation.security.RolesAllowed
@RolesAllowed("ADMIN_ROLE")
Когда мы меняем бэкенд с Active Directory на FreeIPA, роли возвращаются в нижнем регистре, и, таким образом, не соответствуют нашей аннотации RolesAllowed.
Существует ли возможность гарантировать, что наши роли/группы, которые мы получаем и передаем в securitycontext, будут обязательно в верхнем регистре? Просматривая документацию, я не вижу флага, чтобы это заставить, или простого варианта для обработки сравнения без учета регистра для ролей. Спасибо.
Ответ или решение
Для того чтобы убедиться, что WildFly Elytron возвращает все роли в верхнем регистре при аутентификации через LDAP, необходимо произвести несколько настроек. К сожалению, по умолчанию Elytron может не обеспечивать единообразие в регистре ролей, что приводит к проблемам при работе с различными LDAP-поставщиками, такими как Active Directory и FreeIPA.
Вот шаги, которые вы можете предпринять для решения данной проблемы:
1. Настройка пользователя и ролей в Elytron
Вы можете создать пользовательскую реализацию RoleMapping
или использовать функциональность SecurityIdentity
для конвертации ролей в верхний регистр. Для этого можно воспользоваться методами возможности обработки ролей в вашем коде при создании SecurityIdentity
.
2. Создание кастомного модуля для преобразования ролей
Учитывая, что вы работаете с разными LDAP-поставщиками, можно создать собственный класс для преобразования названий ролей, который будет использоваться при аутентификации. Пример:
import org.wildfly.security.auth.principal.GroupPrincipal;
import org.wildfly.security.authz.RoleMapper;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class UpperCaseRoleMapper implements RoleMapper {
@Override
public List<String> getRoles(List<String> roles) {
return roles.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
}
}
3. Настройка Elytron для использования вашего модуля
Затем, необходимо зарегистрировать вашу реализацию RoleMapper
в конфигурации Elytron. Это можно сделать через ваш файл конфигурации standalone.xml
или через CLI WildFly:
<elytron-security-domain name="my-security-domain" ...>
<role-mapper>
<class-name>com.example.UpperCaseRoleMapper</class-name>
</role-mapper>
...
</elytron-security-domain>
4. Проверка конфигурации
После внесения изменений обязательно перезапустите сервер и проведите тестирование аутентификации, используя LDAP в качестве источника данных. Убедитесь, что роли отображаются в верхнем регистре, и ваши аннотации @RolesAllowed
теперь корректно совпадают с возвращаемыми значениями.
5. Рекомендации о тестировании
Когда вы работаете с аутентификацией и авторизацией, важно провести тестирование с различными сценариями аутентификации и различными пользователями из LDAP, чтобы убедиться, что настройки работают как ожидается во всех случаях.
Следуя этим шагам, вы должны успешно обеспечить совместимость верхнего регистра ролей в вашей системе безопасности, реализованной с помощью WildFly Elytron.