Поскольку мы обнаружили, что невозможно поместить 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);
пожалуйста, спросите, если вам нужно больше кода или информации