- 已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含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进行的
1条答案
按热度按时间kpbwa7wx1#
我先回答你真正的问题:“如何确保具有JwtAuthenticationToken
in the security-context of a
@ResController”?”1.使用JWT解码器将应用程序配置为资源服务器
1.使用
isAuthenticated()
保护入口点,或者形成安全过滤器链配置,或者在控制器类或方法上使用@PreAuthorize
(或等效项)(在配置中的某个位置使用@EnableMethodSecurity
)1.当然,不要显式替换成功授权的默认身份验证实现...(例如,当提供身份验证转换器时)
现在,您所阐述的内容得到了完整的回答,并且由于控制器方法调用的安全上下文中
Authentication
实现的类型取决于许多因素而有所不同,因此范围要广得多。运行时
让我们从“真实的的”调用开始(Spring应用程序已启动并运行,没有任何被嘲笑的内容):
AnonymousAuthenticationToken
放入安全上下文中。根据安全配置,这可能是因为缺少访问令牌或访问令牌无效(过期、错误的发行者或受众、错误的签名等)、缺少基本报头等,或者因为授权类型不正确(例如,由期望基本认证的安全过滤器链拦截的路由上的承载令牌)JwtAuthenticationToken
(可通过配置http.oauth2ResourceServer().jwt().jwtAuthenticationConver(...)
进行访问BearerTokenAuthentication
(使用http.oauth2ResourceServer().opaqueToken().authenticationConver(...)
覆盖)oauth2Login
,则使用OAuth2AuthenticationToken
Authentication
类型层次结构)测试
可以使用
@WithMockUser
或MockMvc
(对于React式应用程序分别为WebTestClient
)等注解以及注解或请求后处理器(分别为WebTestClient
mutator)为普通JUnit中的测试设置测试安全上下文。注入的身份验证类型取决于所使用的注解(或mutator /后处理器)。例如,
@WithMockUser
生成很少适应OAuth2上下文的UsernamePasswordAuthenticationToken
。SecurityMockMvcRequestPostProcessors
和spring-security-test
中的mutator或spring-addons中的@WithMockJwtAuth
、@WithMockBearerTokenAuthentication
或@WithOAuth2Login
等注解通常更适合。运行时配置和测试教程
我写了一些可从那里:https://github.com/ch4mpy/spring-addons/tree/master/samples/tutorials