使用Subject.doA运行EJB不会影响Wildfly 15中的EJBContext

时间:2019-02-19 15:32:31

标签: java java-ee ejb wildfly elytron

由于我们发现无法像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;
            }
        });
}

从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
@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);

请询问您是否需要更多代码或信息

0 个答案:

没有答案