背景:需要将审核数据附加到持久化实体,基本上是创建时间戳+用户ID和最后更新时间戳+用户ID。
我并不热衷于通过所有图层/组件将用户ID作为方法参数传递。因此,我需要以某种方式通过REST端点(使用RESTEasy,但这可能并不重要)将用户标识(从HTTP标头派生,细节不重要)传递回数据访问/存储库层。
我已经考虑过使用ThreadLocal
,但感觉有点hackish并且在非阻塞IO环境中可能会失败。也许我错了,不确定。
我也有一个模糊的想法,AOP可以帮助,虽然我不熟悉AOP所以不确定。
无论有无代码,任何策略都会受到赞赏。
答案 0 :(得分:0)
您可以根据自己的要求使用entity lifecycle callback methods:@PrePersist
,@PostPersist
,@PreUpdate
,@PostUpdate
。
这是here提到的审计策略之一。
答案 1 :(得分:0)
事实证明,Spring的SecurityContextHolder
是一个合理的地方(不要问为什么应用程序还没有正确整合"正确"与春季安全)。它基本上是ThreadLocal
选项,但周围有一些很好的界面。
权衡是您需要敏锐地意识到此解决方案的线程限制性质。一个控制器以某种方式使用其他线程来完成需要用户上下文的工作,需要采取一些步骤来确保这些线程可以获取它,因为默认情况下它们不会继承ThreadLocal
。您可以在SecurityContextHolder
上设置一种模式,它将在任何新创建的线程中使用ThreadLocal
的继承,但如果使用线程池则无效(因为线程不会成为由请求线程创建,而是从池中拉出)。即便如此,大多数线程池都为客户端线程提供了一种方法来做什么"在获取和释放线程时,可以通过这种方式传递安全上下文。