在Java 8 lambda中使用时,EJB调用缺少调用者主体

时间:2017-11-02 08:56:45

标签: java hibernate jpa lambda wildfly

我试图从lambda表达式中调用bean API,但它的SessionContext不包含正确的caller principal。它是anonymous

即使这个API上的拦截器也有同样的行为。

仅在从lambda内部调用bean时才会发生。无法找到关于此主题的任何其他问题。

我正在使用WildFly 10.0.0,Hibernate Core 5.0.10(JPA 2.1)

1 个答案:

答案 0 :(得分:1)

在你的情况下在lambda中运行可能意味着代码在不同的线程中执行,并且因为安全上下文通常绑定到一个线程,当你在新线程中运行异步任务时,它不会从父级继承安全上下文。这意味着新线程必须以某种方式重新进行身份验证。对于WildFly 10,如果将其添加到lambda中,这应该可以使用:

org.jboss.security.client.SecurityClient client = SecurityClientFactory.getSecurityClient();
client.setSimple("USERNAME", "PASSWORD");
client.login();
try {
   bean.call();
} finally {
   client.logout();
}

如果您使用Elytron切换到WildFly 11,则可以使用:

final SecurityIdentity identity = org.wildfly.security.auth.server.SecurityDomain.getCurrent().getCurrentSecurityIdentity();
identity.runAs(() -> { the-code-you-want-to-run-with-this-identity } );