由于我们发现无法按照此处所述将 SecurityIdentity 放入 ContextualProxy 中,因此我们尝试找到某种解决方法。
我们在 wildfly 的安全子系统上进行编程登录,并使用返回的 Subject 运行 Runnable。然后,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);
}
可运行:
public class ContextRunnable implements Serializable, Runnable {
private MySingleton bean;
public void run() {
bean.printText("hello");
}
public void setSingletonBean(MySingleton bean) {
this.bean = bean;
}
}
单身人士:
@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);
请询问您是否需要更多代码或信息