我有一个Java EE Web应用程序,它在我的EJB上使用JASPIC和@RolesAllowed注释进行保护。我使用托管执行程序服务来运行许多任务。
但是,任务不是以任何用户身份运行的,因此在尝试访问EJB时,我获得了权限被拒绝的错误。我尝试过使用@RunAs注释,但这似乎不起作用。
我如何以编程方式进行身份验证?
我有抽象类
public abstract class AbstractTask implements Runnable...
和具体的类,然后我将任务提交给托管执行程序服务
mes_.submit(task);
我已经尝试将@RunAs放在这两个课程上,但都没有工作。
答案 0 :(得分:2)
遗憾的是,Java EE中没有任何工具可以以编程方式登录Web上下文。
JASPIC应该已经提供了这一点,但它在某种程度上被遗忘了,或者是他们心中有其他事情的权力。 JASPIC规范文件最后在某处提到它们会在以后查看,但它从未发生过。
@RunAs
有点受限,但是对于这种情况一般应该有效。您可能需要提供一些代码,WildFly可能会要求一些自定义配置。
您的@RolesAllowed
带注释的EJB方法是否仅从托管执行程序服务调用?在WildFly 8中,当从Servlet调用EJB时,@RolesAllowed
被破坏,但应该在WildFly 9中修复。
答案 1 :(得分:1)
您应该显示更多代码。现在你的问题中的内容并不是很有用,因为它基本上是使用执行程序服务所暗示的。确保显示您放置@RunAs
的确切类别。
我觉得问题出在哪里,那就是你不能把@RunAs
放在任何普通类上,而是需要使用中间不安全的EJB。 '@ RunAs`有点令人困惑,因为它没有为使用它注释的方法设置角色,而是设置传出呼叫的角色。
因此订单是
执行人服务 - >任务 - >使用@RunAs方法的中间EJB bean - >安全的bean与@RolesAllowed