【发布时间】:2011-12-22 11:12:27
【问题描述】:
我想在从 Java Web 应用程序 (Wicket) 调用其方法时将身份验证信息传递给 EJB 无状态会话 bean。该信息由用户 ID 和身份验证类型(记住 cookie 或用户/密码)组成,并存储在 http 会话中。一个明显的解决方案是将此作为参数添加到所有 EJB 方法中,但这很麻烦,我希望存在另一种解决方案。
EJB bean 的 JNDI 查找是通过 web 层中的 javax.naming.InitialContext#lookup(String) 完成的。
是否有一种可移植的方式将身份验证信息添加到调用上下文中,以便 bean 可以使用它?我需要此过程可供 EJB 层(用于最终的 Web 服务端点)和 Web 层中的调用者使用。
更多信息
我使用的是 Java EE 6。没有使用 CDI,我宁愿避免实现它。
身份验证由 web 层处理,无状态 bean 验证记住 cookie 和用户/密码组合。当访问者第一次访问该站点时,会尝试使用记忆 cookie 进行身份验证。当最终需要时,会要求用户使用用户名和密码登录。如上所述,身份验证状态存储在 http 会话中。我不使用基于领域的 Java EE 安全模型,因为我无法弄清楚如何正确集成此身份验证流程。
授权方案基于动态角色,类似于 Facebook 如何根据 2 个用户之间的链接和某些偏好来确定授权。某些操作还考虑了身份验证类型。例如,修改帐户设置需要用户/密码,而 cookie 是不够的。据我了解,Java EE 标准组和角色并不适合此要求。
我发现的其他相关问题
EJB3 & How JAAS subject/principal is propagated to EJB Tier from servlet container?
Controlling the security Principle passed on a EJB call
Binding a User entity and a GlassFish Principal
Accessing the clients principal inside an ejb method
dynamic roles on a Java EE server
我希望我的问题足够清楚。如果需要更多信息,我很乐意提供。
编辑
固定链接。添加关于 CDI 的注释。
【问题讨论】:
-
adam-bien.com/roller/abien/entry/how_to_pass_context_with 描述了一种使用线程本地存储在层之间共享上下文信息的方法。但是,我担心这种方法会导致集群和异步方法调用存在问题。
标签: security authentication jakarta-ee ejb-3.0 java-ee-6