gpt4 book ai didi

java - 使用外部身份验证源时如何在 Spring Boot 中模拟身份验证

转载 作者:行者123 更新时间:2023-12-01 18:14:31 24 4
gpt4 key购买 nike

我有一个基于 Spring Boot 的应用程序,我们使用来自外部提供商的 ISAM 身份验证。我有一个rest/json端点/actuator/health,它根据用户是否经过身份验证返回不同的数据。

如何在单元测试期间模拟身份验证以确保我的配置正确?

setup() 中,我尝试手动设置 token ,并重写 AuthorizationService 以返回 true。

@Before
public void setUp() throws Exception
{
mockMvc = webAppContextSetup(wac).apply(springSecurity()).build();

List roles = Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));

UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken("dave", "secret",
roles);

if (!auth.isAuthenticated()) { fail("NOT AUTHENTICATED!"); }

SecurityContextHolder.getContext().setAuthentication(auth);

//fake logged in
when(authorizationService.isCurrentUserAuthorized(anyString(),
anyString(),
ArgumentMatchers.any(ResourceType.class),
ArgumentMatchers.any(ActionType.class)))
.thenReturn(true);
}

但是,当我运行时

Authentication auth = SecurityContextHolder.getContext().getAuthentication();

if (!auth.isAuthenticated()) { fail("NOT AUTHENTICATED!"); }

UsernamePasswordAuthenticationToken authToken =
(UsernamePasswordAuthenticationToken)auth;

mockMvc.perform(get("/health_secure")
.principal(auth)
.header("Authorization", "Bearer " + token))
.andDo(print())
.andExpect(status().isOk())
.andExpect(forwardedUrl("/actuator/health"));

我得到:

"error":"invalid_token","error_description":"Cannot convert access token to JSON"

最佳答案

很好的答案,正确here 。由于 Spring Security 不会创建请求范围的 bean,因此您需要自己创建一个并将其注入(inject)到需要的地方。这让您有机会自己 mock 它。

类似这样的吗?:

@Service
@RequiredArgsConstructor
public class UserService {

public Principal getPrincipal() {
return SecurityContextHolder.getContext().getAuthentication();
}

public Optional<String> getCurrentLogin() {
Principal principal = getPrincipal();
if (principal == null)
return Optional.empty();
return Optional.ofNullable(principal.getName());
}

}

关于java - 使用外部身份验证源时如何在 Spring Boot 中模拟身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60400474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com