Spring Security有时匿名用户[已关闭]

wmvff8tz  于 2023-02-12  发布在  Spring
关注(0)|答案(1)|浏览(185)

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2小时前关门了。
Improve this question
Spring Boot-Angular 应用:
为什么我的方法在从一个控制器调用时返回"AnonymousUser",而在从另一个控制器调用时返回正确的用户id?
我有一个返回登录用户的方法:

@Override
public String getLoggedUserName() {
    return SecurityContextHolder.getContext().getAuthentication().getName();
}

当我从一个控制器调用它时,它返回登录用户的名称,但当我从另一个控制器调用它时,它返回"AnonymousUser"。
我不知道它作为附加信息是否有用,但身份验证是通过Keycloak进行的

kpbwa7wx

kpbwa7wx1#

我先回答你真正的问题:“如何确保具有JwtAuthenticationToken in the security-context of a@ResController”?”
1.使用JWT解码器将应用程序配置为资源服务器
1.使用isAuthenticated()保护入口点,或者形成安全过滤器链配置,或者在控制器类或方法上使用@PreAuthorize(或等效项)(在配置中的某个位置使用@EnableMethodSecurity
1.当然,不要显式替换成功授权的默认身份验证实现...(例如,当提供身份验证转换器时)
现在,您所阐述的内容得到了完整的回答,并且由于控制器方法调用的安全上下文中Authentication实现的类型取决于许多因素而有所不同,因此范围要广得多。

运行时

让我们从“真实的的”调用开始(Spring应用程序已启动并运行,没有任何被嘲笑的内容):

  • 请求未授权,则将AnonymousAuthenticationToken放入安全上下文中。根据安全配置,这可能是因为缺少访问令牌或访问令牌无效(过期、错误的发行者或受众、错误的签名等)、缺少基本报头等,或者因为授权类型不正确(例如,由期望基本认证的安全过滤器链拦截的路由上的承载令牌)
  • 请求已成功授权=〉默认身份验证取决于安全配置
  • 资源服务器,则使用JwtAuthenticationToken(可通过配置http.oauth2ResourceServer().jwt().jwtAuthenticationConver(...)进行访问
  • resource-server与访问令牌自检,则使用BearerTokenAuthentication(使用http.oauth2ResourceServer().opaqueToken().authenticationConver(...)覆盖)
  • 客户端具有oauth2Login,则使用OAuth2AuthenticationToken
  • 等等,非OAuth2身份验证的列表还在继续(只需查看Authentication类型层次结构)

测试

可以使用@WithMockUserMockMvc(对于React式应用程序分别为WebTestClient)等注解以及注解或请求后处理器(分别为WebTestClient mutator)为普通JUnit中的测试设置测试安全上下文。
注入的身份验证类型取决于所使用的注解(或mutator /后处理器)。例如,@WithMockUser生成很少适应OAuth2上下文的UsernamePasswordAuthenticationTokenSecurityMockMvcRequestPostProcessorsspring-security-test中的mutator或spring-addons中的@WithMockJwtAuth@WithMockBearerTokenAuthentication@WithOAuth2Login等注解通常更适合。

运行时配置和测试教程

我写了一些可从那里:https://github.com/ch4mpy/spring-addons/tree/master/samples/tutorials

相关问题