Как протестировать Spring PreAuthorize с помощью областей действия oauth2 - PullRequest
0 голосов
/ 14 февраля 2019

У нас есть приложение, защищенное ResourceServer, и мы используем GlobalMethodSecurity для ограничения доступа к конечным точкам API в зависимости от области клиента.Это все работает, как и ожидалось.

Я сейчас пытаюсь написать несколько интеграционных тестов.В своих тестах я вручную создаю допустимый JWT, а затем выполняю вызовы к ограниченной конечной точке.Если я не отправляю токен, я получаю 401, как и ожидалось, но когда я отправляю токен, у которого отсутствует требуемая область, он не отклоняется, но может достичь конечной точки.

Я предполагаю, что мне не хватает какой-то конфигурации или настройки, чтобы заставить @PreAuthorize работать правильно, но я не уверен, что именно мне не хватает.

Вот мой тестовый класс:

@RunWith(SpringRunner.class)
@WebAppConfiguration
@SpringBootTest
public class UserIT extends BaseIntegrationTest {

@Autowired
private UserRepository userRepository;

@Autowired
private WebApplicationContext wac;

@Autowired
private FilterChainProxy springSecurityFilterChain;

private MockMvc mockMvc;

@Before
public void setup () {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).addFilters(springSecurityFilterChain).build();
}

@Test
public void cannotGetUsersWithoutToken () throws Exception {
    mockMvc
            .perform(get("/user/protected/user"))
            .andExpect(status().isUnauthorized());
}

@Test
public void cannotGetUsersWithoutCorrectScope () throws Exception {
    String token = getToken(Collections.singletonList("MY_ROLE"), 2);

    mockMvc
            .perform(get("/user/protected/user").header("Authorization", "Bearer " + token))
            .andExpect(status().isUnauthorized());
    } 
}

А вот метод API:

@PreAuthorize("isAuthenticated() and #oauth2.hasScope('my-scope')")
@RequestMapping(value="/user", method = RequestMethod.GET)
public UserInfo getUser(){
    long userId = getUserId();

    return userService.retrieveUser(userId);
}

Первый тест проходит, а второй - нет;200 возвращается вместо 401.

Любые предложения относительно того, что мне не хватает, будут оценены.Я следил за этим https://www.baeldung.com/oauth-api-testing-with-spring-mvc.

...