由于我们发现无法像here所述那样将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;
}
});
}
@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始终是“匿名的”。 我的猜测是,由于将使用Elytron,wildfly的旧版安全系统不再与ejb容器“连接”。
有没有办法解决这个问题?
我也尝试使用here中所述的Elytron系统,但结果相同:
AuthenticationConfiguration config = AuthenticationConfiguration.empty().useName("admin").usePassword("admin");
AuthenticationContext.empty().with(MatchRule.ALL, config)
.run(contextRunnable);
请询问您是否需要更多代码或信息