将用户标识从REST端点暴露回数据访问/存储库层的策略

时间:2015-10-21 01:39:01

标签: java spring hibernate rest jpa

背景:需要将审核数据附加到持久化实体,基本上是创建时间戳+用户ID和最后更新时间戳+用户ID。

我并不热衷于通过所有图层/组件将用户ID作为方法参数传递。因此,我需要以某种方式通过REST端点(使用RESTEasy,但这可能并不重要)将用户标识(从HTTP标头派生,细节不重要)传递回数据访问/存储库层。

我已经考虑过使用ThreadLocal,但感觉有点hackish并且在非阻塞IO环境中可能会失败。也许我错了,不确定。

我也有一个模糊的想法,AOP可以帮助,虽然我不熟悉AOP所以不确定。

无论有无代码,任何策略都会受到赞赏。

2 个答案:

答案 0 :(得分:0)

您可以根据自己的要求使用entity lifecycle callback methods@PrePersist@PostPersist@PreUpdate@PostUpdate

这是here提到的审计策略之一。

答案 1 :(得分:0)

事实证明,Spring的SecurityContextHolder是一个合理的地方(不要问为什么应用程序还没有正确整合"正确"与春季安全)。它基本上是ThreadLocal选项,但周围有一些很好的界面。

权衡是您需要敏锐地意识到此解决方案的线程限制性质。一个控制器以某种方式使用其他线程来完成需要用户上下文的工作,需要采取一些步骤来确保这些线程可以获取它,因为默认情况下它们不会继承ThreadLocal。您可以在SecurityContextHolder上设置一种模式,它将在任何新创建的线程中使用ThreadLocal的继承,但如果使用线程池则无效(因为线程不会成为由请求线程创建,而是从池中拉出)。即便如此,大多数线程池都为客户端线程提供了一种方法来做什么"在获取和释放线程时,可以通过这种方式传递安全上下文。