Инъекция CDI в JASPIC ServerAuthModule не работает - PullRequest
0 голосов
/ 16 мая 2018

Использование Wildfly 11 Final на Java 10.

У меня есть реализация JASPIC, которая сама по себе работает как надо. Мне нужно подключить его к БД, чтобы я мог сделать аутентификацию в public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {...}. Однако @Resource(mappedName="java:jboss/datasources/someDB") javax.sql.DataSource db; всегда null для db.

CDI работает, как и ожидалось, для произвольного класса сервлетов в том же архиве WAR - если я поместил эту точную строку в класс сервлетов, он даст объект DataSource.

Я работаю над этим с ручным поиском через private static InitialContext ic; Но мне нужен CDI для других глобальных вещей. Кто-нибудь сталкивался с такой проблемой? WEB-INF/beans.xml имеет атрибут bean-discovery-mode="all" в элементе beans.

public class SrvAuthModuleImpl implements ServerAuthModule {

@Resource(mappedName="java:jboss/datasources/someDB") javax.sql.DataSource db; //always null
private static InitialContext ic; //workaround via manual lookup

private CallbackHandler handler;
private Class<?>[] supportedMessageTypes = new Class[] {HttpServletRequest.class, HttpServletResponse.class};

@Override
public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, @SuppressWarnings("rawtypes") java.util.Map options) throws AuthException {
    this.handler = handler;
}

@Override
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) throws AuthException {

    try (
        Connection c = getDb().getConnection(); //works
        // Connection c = db.getConnection(); //db is null, exception thrown
    ) {

    } catch (SQLException ex) {

    }

    return AuthStatus.SUCCESS;
}

@Override
public Class<?>[] getSupportedMessageTypes() {return supportedMessageTypes;}
@Override
public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) throws AuthException {return AuthStatus.SEND_SUCCESS;}
@Override
public void cleanSubject(MessageInfo messageInfo, Subject subject) throws AuthException {}

private static javax.sql.DataSource getDb() {
    try {
        if (ic == null) {
            synchronized(TestServerAuthModule.class) {
                if (ic == null) {
                    ic = new javax.naming.InitialContext();
                }
            }
        }
        return (javax.sql.DataSource)ic.lookup("java:jboss/datasources/someDB");
    } catch (Exception ex) {
        return null;
    }
}
}

1 Ответ

0 голосов
/ 16 мая 2018

Это ожидается. JASPIC старше чем Resource Injection или CDI и не поддерживает ни того, ни другого.

В Java EE 7 вы можете использовать что-то вроде

CDI.current().select(MyBean.class).get()

чтобы получить компоненты CDI в неуправляемом контексте.

Другой вариант - Soteria , эталонная реализация API безопасности Java EE 8, которая также работает в WildFly 11.

...