Spring Security 在Sping Boot 应用程序中的何处注入自定义审计服务

4smxwvx5  于 2023-10-20  发布在  Spring
关注(0)|答案(1)|浏览(148)

我有一个多模块的spring Boot 应用程序,每个模块都依赖于一个审计服务(它在一个“helper”模块中定义,只有一个名为audit()的方法,它实际上所做的就是用WebClient调用另一个应用程序,发送一些关于当前用户的数据)。
目前,它被注入到每个模块的服务类中,它只是发送一些硬编码的数据(因为身份验证还没有准备好),但现在我需要提取用户信息(从OAuth JWT声明中),并实际将其与令牌沿着传递,以向审计应用程序发出经过身份验证的请求。

  • 其中一个模块的主服务的伪代码 *
class ActualService {
    
   AuditService auditSvc
   ActualRepository actualRepo

   public void updateSomething(RequestDTO request, JWT authenticatedUser) {
       ....doSomething()
       auditSvc.audit(someHardcodedValues)
   }

}

什么是实现这一目标的适当方法?我正在考虑将审计服务注入到每个模块的控制器中,并在调用实际的主服务方法之后和向客户端返回响应之前调用审计方法(并将其传递给整个JWT)。

  • 就像这样 *
class ActualController {

    AuditService auditSvc
    ActualService actualService

    @PutMapping
    public ResponseEntity<String> updateSomething(RequestDTO request, JWT authenticatedUser) {
       actualService.updateSomething(request, authenticatedUser)
       auditSvc.audit(authenticatedUser)
       return ResponseEntity.OK
    } 

}

但我不知道这是不是个好方法。任何明智的想法欢迎,谢谢

ne5o7dgx

ne5o7dgx1#

实现这一点的一种方法是使用ThreadLocal来保留JWT令牌。ThreadLocal变量可以在过滤器中创建,然后将标记存储在变量中。
此链接有类似的答案,但对于RestTemplate,Propagate HTTP header (JWT Token) over services using spring rest template

相关问题