我正在尝试设置或访问当前登录的用户信息,如用户名。我的令牌是使用Spring Authorization服务器使用客户端凭据流生成的。因此,我使用的是在我的测试用例中指定的资源服务器,如下所示:
spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://localhost:9000
当我在Spring WebFlux中运行我的测试用例时,我无法在我的处理程序中使用如下代码访问登录的用户:
LOG.info("user logged in is {}", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
我想做一些类似于我以前为自定义身份验证提供程序所做的事情:
UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken =
new UsernamePasswordAuthenticationToken(jwt.getSubject(), null, list);
SecurityContextHolder.getContext()
.setAuthentication(usernamePasswordAuthenticationToken);
但是现在我使用资源服务器来验证令牌,我不确定如何设置当前登录的用户。
2条答案
按热度按时间xurqigkl1#
我发现了一种使用
ServerRequest
对象获取用户名的方法,如Spring Security示例中所示:jfgube3f2#
我用模拟的OAuth2
Authentication
编写了用于单元和集成测试的an article on Baeldung。在使用JWT解码器的资源服务器中,默认的
Authentication
实现是JwtAuthenticationToken
。因此,除非您使用JwtAuthenticationConverter显式更改,否则应该使用JwtAuthenticationToken
(而不是UsernamePasswordAuthenticationToken
)填充安全上下文。使用
WebTestClient
(或servlet应用程序中的WebMvc
)运行测试时,安全上下文不是从访问令牌构建的:它将需要一个真正的授权服务器来提供JWT公钥或响应内省请求。测试安全上下文由以下任一项填充:SecurityContextHolder.getContext().setAuthentication(jwtAuthenticationToken)
WebTestClient
mutator(或WebMvc
请求后处理器):webTestClient.mutateWith(SecurityMockServerConfigurers.mockJwt()...)