【问题标题】:JPA auditing with user id使用用户 ID 进行 JPA 审计
【发布时间】:2013-08-08 15:24:24
【问题描述】:

我想在我的网络项目中实施审计。基本上,我的应用程序由一个调用 EJB 项目 (JAR) 中的方法的 Web 项目 (WAR) 组成,所有内容都包装在一个 EAR 中,该 EAR 部署在一个容器中(Jboss 和可能在不久的将来的 Websphere)。

所以,我得到了 web 端的用户会话和 ejb 端的实体和 DAO。我想对某些用户事务实施审计程序,因此数据状态应与执行更改的用户的 id 一起保存在数据库中。

我可以轻松地将每次调用的用户 ID 传递给 EJB 端并从业务方法中执行审计,但这会使我的业务和客户端方法变得混乱。

我研究了Hibernate Envers,这是一个非常有趣的审计框架,但它不会审计开箱即用的用户 ID。所以我进一步查看并发现this post,它解释了如何使用 RevisionListener 从会话中获取用户 ID 并将其存储在数据库中。但是,它似乎在 EAR 架构中不起作用,原因如下:此 RevisionListener 使用 FacesContext.getCurrentInstance() 从会话中获取用户 ID,因此这意味着 RevisionListener 应该位于 Web 端应用程序,而不是 EJB 端...

好吧,我希望我已经足够清楚了:)

干杯!

【问题讨论】:

  • 您使用的是哪种类型的 EJB:会话 bean 和/或 JPA javax.persistence.Entity bean?
  • 我的 EJB 都是 @Stateless,我的实体是 javax.persistence.@Entity

标签: hibernate jsf ejb ear hibernate-envers


【解决方案1】:

如果您已经拥有包含业务逻辑的无状态 会话 bean,则 经过身份验证的用户 的名称已经传递到您的 EJB 中

您可以使用sessionContext.getCallerPrincipal() 来获取调用用户的姓名。

要求

  • 网络应用使用login-config(在web.xml 中定义)
  • JBoss Web 应用程序使用security-domain (jboss.xml);其他应用服务器应该有类似的模式来实现登录/身份验证

【讨论】:

  • 嗯...我不确定我能不能走这条路。我的应用程序可能部署在不同的容器中,特别是 Websphere,所以我不能依赖 Jboss 特定的配置。抱歉,我在我的问题中提到了 Jboss,我将删除该引用。
  • 目前我只在 JSF/Servlet 会话中存储记录的用户信息。
  • 安全域是 JBoss 特定的实现,它是登录配置的后端。在其他容器中也可以使用登录配置模式。如果您仅在 Web 层中拥有用户信息,则必须以某种方式将其传递给 EJB——通过参数显式传递或使用主体隐式传递。 JBoss 登录模块 的WebSphere 对应物是自定义用户注册表 - 只是名称不同,模式相同。
  • 伟大的铍!我将研究这种“主要”模式。干杯!
猜你喜欢
  • 2019-12-18
  • 2019-03-05
  • 1970-01-01
  • 2017-07-09
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多