【发布时间】:2021-05-20 21:23:59
【问题描述】:
在this tutorial 中,作者在@Controller 中为RestTemplate 使用了一个全局变量。
对于传入请求,他从请求中提取 Bearer 令牌,并添加一个拦截器,将令牌添加到 RestTemplate 的传出请求中。
我认为,可能存在竞争条件。第二个用户的请求可能会从第一个用户那里获得拦截器,因此作为第一个用户进行身份验证。
根据 Okta 的说法,他们测试了代码并且没有遇到任何竞争条件。 Spring 中是否有某种机制可以确保这一点?
【问题讨论】:
-
我唯一能看到的似乎很糟糕的是他在每个请求中添加了一个新的拦截器,它只会添加并添加并添加,因为我认为 RestTemplate 是一个单例跨度>
-
所以我假设他的每个请求都将包含大约 1 亿个 Authentication 标头,因为它为每个请求添加了一个标头。
-
是的,这也是正确的,但此外,由于 RestTemplate 是一种单例,一个请求也会有其他请求的拦截器,对吧?因此,我的请求会有来自其他用户的令牌吗?或者拦截器是否绑定到请求?我不相信。
-
一个请求可以有多个相同的标头,这意味着接收端的实现是如何编写的,如果它使用所有标头,通常人们只取第一个标头,但我会说,他的解决方案很糟糕。
-
但是从安全的角度来看,传输错误的令牌已经很危险了。图片是银行账户的 GET 请求。可能会导致看到其他人的帐户 :-D 但是比赛条件不是你的意思吗?所以想象一下对方总是拿第一个标头:我认为,由于竞争条件,用户可能会得到错误的令牌。
标签: spring-security resttemplate okta