我试图从lambda表达式中调用bean API,但它的SessionContext
不包含正确的caller principal
。它是anonymous
。
即使这个API上的拦截器也有同样的行为。
仅在从lambda内部调用bean时才会发生。无法找到关于此主题的任何其他问题。
我正在使用WildFly 10.0.0,Hibernate Core 5.0.10(JPA 2.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 } );