Запуск EJB с Subject.doAs не влияет на EJBContext в Wildfly 15 - PullRequest
0 голосов
/ 19 февраля 2019

Поскольку мы обнаружили, что невозможно поместить SecurityIdentity в ContextualProxy, как описано здесь , мы пытаемся найти какой-то обходной путь.

Мы делаем программный вход в систему наподсистема безопасности wildfly и запустить Runnable с возвращающимся субъектом.После этого исполняемый файл должен иметь возможность запускать определенные EJB в зависимости от ролей субъекта, но EJBContext или SessionContext всегда являются «анонимными».

Код:

Логин

public class RunnableHandlerImpl implements RunnableHandler {

@Override
public void runAsPrivileged(final ContextRunnable runnable) throws LoginException {
    LoginContext ctx;
    ctx = new LoginContext("myDomain",  new MyCallbackHandler(runnable.getAuthToken()));
    ctx.login();
    Subject subject = ctx.getSubject();
    Subject.doAs(subject, new PrivilegedExceptionAction() { 
            @Override
            public Object run() throws Exception {
                runnable.run();
                return null;
            }
        });
}

звонок с mdb:

@Inject
MySingleton bean;
public void onMessage(Message msg) {
    ContextRunnable contextRunnable = (ContextRunnable) message.getObject();
    contextRunnable.setSingletonBean(bean);

    RunnableHandler handler = new RunnableHandlerImpl();
    handler.runAsPrivileged(contextRunnable);
}

Runnable:

public class ContextRunnable implements Serializable, Runnable {
    private MySingleton bean;
    public void run() {
        bean.printText("hello");
    }
    public void setSingletonBean(MySingleton bean) {
        this.bean = bean;
    }
}

Singleton:

@Singleton
@SecurityDomain("DemoApplicationDomain")
@PermitAll
public class MySingleton {
    @Resource EJBContext context;
    @Resource SessionContext sessionCtx;
    public void printText(String text) throws EJBAccessException {
        System.out.println("ejbcontext: " + context.getCallerPrincipal().getName());
        System.out.println("SessionContext: " + sessionCtx.getCallerPrincipal().getName());
        System.out.println("text: " + text);
    }
}

логин работает просто отлично, и я всегда получаюправильное имя от принципала, но ejbcontext и sessioncontext всегда являются «анонимными».Я предполагаю, что устаревшая система безопасности wildfly больше не «связана» с ejb-контейнером, так как будет использоваться Elytron.

Есть ли способ исправить это?

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

AuthenticationConfiguration config = AuthenticationConfiguration.empty().useName("admin").usePassword("admin");
AuthenticationContext.empty().with(MatchRule.ALL, config)
                     .run(contextRunnable);

пожалуйста, спросите, если вам нужно больше кода или информации

...