如何使用资源服务器使用spring security设置当前登录的用户信息?

ijnw1ujt  于 2023-06-23  发布在  Spring
关注(0)|答案(2)|浏览(167)

我正在尝试设置或访问当前登录的用户信息,如用户名。我的令牌是使用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);

但是现在我使用资源服务器来验证令牌,我不确定如何设置当前登录的用户。

xurqigkl

xurqigkl1#

我发现了一种使用ServerRequest对象获取用户名的方法,如Spring Security示例中所示:

serverRequest.principal()
            .map(Principal::getName)
            .flatMap(username ->
                ServerResponse.ok()..
jfgube3f

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()...)
  • 来自a lib I maintain的测试注解:
@Test
@WithMockJwt()
void whenUserIsAuthenticated_whenSomeQuery_thenSomeExpectation() {
}

相关问题