Как я могу издеваться над аутентификацией в Spring Boot при использовании внешнего источника аутентификации - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть приложение на основе 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"

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Мое приложение аутентифицируется с помощью ISAM / OAuth2

Я надеялся просто переопределить AuthenticationManager или OAuth2AuthenticationManager

Я нашел решение несколько более низкого уровня .

ПРИМЕЧАНИЕ: Я бы хотел увидеть решение на уровне AuthenticationManager.

Мне пришлось переопределить компонент ResourceServerTokenServices , чтобы смоделировать мои поддельные данные аутентификации.

Я добавил метод setAuth() к своему методу @Before.

   //"constants" for fake auth values
   private static final String user = "MyUser";
   private static final String token = "MyTokenString";

   //TokenServices to validate/convert ISAM Bearer Token
   @MockBean ResourceServerTokenServices tokenServices;

   private Authentication setAuth() throws Exception
   {
      UsernamePasswordAuthenticationToken auth =
              new UsernamePasswordAuthenticationToken(user, token,
                                                      Collections.emptyList());

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

      SecurityContextHolder.getContext().setAuthentication(auth);

      DefaultOAuth2AccessToken mockTokenImpl = new DefaultOAuth2AccessToken(user);
      mockTokenImpl.setScope(Collections.singleton("authenticate:applications"));
      mockTokenImpl.setTokenType("Bearer");

      when(tokenServices.readAccessToken(anyString())).thenReturn(mockTokenImpl);

      OAuth2Authentication oa2Auth = mock(OAuth2Authentication.class);
      when(oa2Auth.getPrincipal()).thenReturn(user);
      when(oa2Auth.getCredentials()).thenReturn(token);
      when(oa2Auth.getUserAuthentication()).thenReturn(auth);
      when(oa2Auth.isAuthenticated()).thenReturn(true);

      OAuth2Request oa2Req = mock(OAuth2Request.class);
      when(oa2Auth.getOAuth2Request()).thenReturn(oa2Req);

      when(tokenServices.loadAuthentication(anyString())).thenReturn(oa2Auth);

      return auth;
   }

Этот метод настраивает tokenServices на получение всей необходимой информации для подделки его пути. до authenticate() с пружинами OAuth2AuthenticationManager класс.

0 голосов
/ 26 февраля 2020

Отличный ответ правильно здесь . Поскольку Spring Security не создает bean-объект в области запроса, создайте его самостоятельно и внедрите его в те места, где он вам нужен. Это дает вам возможность издеваться над собой.

Как то так?

1006 *
...