1

由于我们发现无法按照此处所述将 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);

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

4

0 回答 0