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

来源:爱站网时间:2021-09-16编辑:网友分享
我有一个基于Spring Boot的应用程序,我们使用来自外部提供商的ISAM身份验证。我有一个rest / json端点/ actuator / health,它会根据用户是否...来返回不同的数据...

问题描述


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

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

setup()中,我尝试手动设置令牌,并覆盖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,因此请自己创建一个bean并将其注入到需要的地方。这使您有机会自己模拟它。

这样的事情?:

@Service
@RequiredArgsConstructor
public class UserService {

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

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

}

上一篇:CrudRepository保存方法未保存到oracle数据库

下一篇:@ Autowired HttpServletRequest的SpringBoot转发请求导致StackOverFlow异常

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载