Как обеспечить возврат всех ролей в верхнем регистре для аутентификации LDAP в WildFly Elytron?

Вопрос или проблема

Работаем над тем, чтобы наш деплоймент 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.

Оцените материал
Добавить комментарий

Капча загружается...