我有一个基于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()
将不再工作,因为上下文持有者在不同的示例上是不同的。
1条答案
按热度按时间kulphzqa1#
对于任何请求,ServletFilter(验证)总是与处理它的ServletController在同一个服务器上。filterChain将请求传递给控制器,并具有相同的安全上下文。使用JWT,每个请求都经过验证(因为每个请求都经过过滤器),并允许服务是无状态的。这样做的优点是可伸缩性-您可以根据需要拥有任意多的示例。