Wildfly 17 Elytron: аутентификация на стороне сервера с классами из EAR

Мы планируем перейти с Picketbox на Elytron и столкнемся со следующей проблемой:

С помощью Picketbox настраиваемый модуль входа в систему может использовать функциональность (или даже может находиться внутри) модуля развертывания (например, EAR в wildfly / standalone / deployments) для реализации аутентификации на стороне сервера:

<subsystem xmlns="urn:jboss:domain:security:2.0">
    <security-domains>
        ...
        <security-domain name="MyDomain" cache-type="default">
            <authentication>
                <login-module name="MyLoginModule" code="de.example.wildfly.MyLoginModule" flag="required" module="deployment.de.example.wildfly.login"/>
            </authentication>
        </security-domain>

Моей первой попыткой было использовать настраиваемый мир в Elytron. Но, насколько я понимаю, настраиваемая область должна быть «статическим» модулем (это означает, что он находится в wildfly / modules / ...) и, следовательно, не может получить доступ к «динамически» развернутым модулям (см. https://developer.jboss.org/message/984198#984198).

<subsystem xmlns="urn:wildfly:elytron:7.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto">
    ...
    <security-domains>
        <security-domain name="MyDomain" default-realm="MyRealm" permission-mapper="default-permission-mapper">
            <realm name="MyRealm" role-decoder="from-roles-attribute" />
        </security-domain>
    </security-domains>
    <security-realms>
        ...
        <custom-realm name="MyRealm" module="de.example.wildfly.login" class-name="de.example.wildfly.MyCustomRealm" />

(Я пропустил еще несколько настроек домена безопасности)

Когда я пытаюсь загрузить контекст Spring (который находится в EAR для доступа к некоторым настраиваемым классам из EAR) в MyCustomRealm, я получаю следующую ошибку:

org.springframework.beans.factory.access.BootstrapException: Unable to initialize group definition. Group resource name [classpath:applicationContext-appServerBase.xml], factory key [applicationContextEjb]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext-appServerBase.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext-appServerBase.xml] cannot be opened because it does not exist

Что неудивительно, потому что моя область не зависит от уха или какой-либо фляги в нем, где находится контекст приложения.

Как можно настроить аутентификацию (особенно для вызовов EJB) на стороне сервера с помощью классов из модуля развертывания (EAR) в Elytron?


person Olaf Ziems    schedule 21.06.2019    source источник


Ответы (1)


Может быть, https://github.com/AntonYudin/wildfly-securityrealm-ejb точно что ты ищешь. Он создает SecurityRealm, который можно настроить с адресом EJB, развернутого с вашим приложением.

EJB должен быть Stateless и реализовывать метод Map<String, Object> authenticate(String, String), который вызывается с username и password.

Я думаю, вам нужно вернуть карту, содержащую все roles и groups, к которым принадлежит пользователь, или null, если учетные данные недействительны.

person Kevin H.    schedule 19.07.2019
comment
Время шло, поэтому мы решили не переходить на Elytron, а остаться с Picketbox. Из-за нехватки времени я не могу подтвердить, что предложенный обходной путь действительно сработает, но я почти уверен, что это так. Поэтому я принимаю этот ответ как правильный и сохраню его в памяти для следующего выпуска нашего программного обеспечения. Большое спасибо! - person Olaf Ziems; 22.07.2019