У нас есть приложение, защищенное 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.