Spring Boot Sping Boot -通过多个服务器示例保持已验证用户

lhcgjxsq  于 2023-02-04  发布在  Spring
关注(0)|答案(1)|浏览(142)

我有一个基于JWT令牌的springsecuritySTATELESS应用程序。

override fun doFilterInternal(
        request: HttpServletRequest,
        response: HttpServletResponse,
        chain: FilterChain,
    ) {
        val header = request.getHeader(Objects.requireNonNull(HttpHeaders.AUTHORIZATION))
        if (header != null) {
            val authorizedUser = tokensService.parseAccessToken(header)
            SecurityContextHolder.getContext().authentication = authorizedUser
        }
        chain.doFilter(request, response)
    }

如您所见,我将authorizedUser保存到SecurityContextHolder中。然后,在用户B检索用户A的数据之前,我使用此保存的用户来保护我的应用,如下所示:

@Target(AnnotationTarget.FUNCTION)
    @Retention(AnnotationRetention.RUNTIME)
    @PreAuthorize("authentication.principal.toString().equals(#employerId.toString())")
    annotation class IsEmployer

    @IsEmployer
    @GetMapping("/{employerId}")
    fun getCompanyProfile(@PathVariable employerId: Long): CompanyProfileDTO {
        return companyProfileService.getCompanyProfile(employerId)
    }

但当应用程序作为单个示例运行时,它可以工作,而我想在许多示例上部署此应用程序,所以

authentication.principal.toString().equals(#employerId.toString()

将不再工作,因为上下文持有者在不同的示例上是不同的。

kulphzqa

kulphzqa1#

对于任何请求,ServletFilter(验证)总是与处理它的ServletController在同一个服务器上。filterChain将请求传递给控制器,并具有相同的安全上下文。使用JWT,每个请求都经过验证(因为每个请求都经过过滤器),并允许服务是无状态的。这样做的优点是可伸缩性-您可以根据需要拥有任意多的示例。

相关问题