-1

Я использую Spring Boot и Oauth2 для Spring Security, и я хочу проверить, доступна ли данная конечная точка API для всех пользователей.Весна: Как проверить программно, если заданная конечная точка защищена

Пример класса конфигурации OAuth:

@Configuration 
public class OAuth2ServerConfiguration { 

     //(...) 

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      http 
       .authorizeRequests() 
        .antMatchers("/", "/login**", "/logout**", "/denied**", "/index**") 
         .permitAll() 
        .antMatchers("/ma/**", "/maintenance/**", "/api/maintenance/**") 
         .permitAll() 
//      .hasAnyRole("ADMIN") 
        .antMatchers("/api/**") 
         .permitAll() 
//      .hasAnyRole("ADMIN", "USER") 
        .anyRequest() 
         .denyAll() 
       .and() 
        .exceptionHandling() 
         .accessDeniedPage("/denied") 
       .and() 
        .csrf() 
         .disable(); 
     } 

     //(...) 
} 

Как проверить программным способом, если, например, enpoint /api/someMethod доступен для всех (зарегистрирован .permitAll())? Есть ли простой способ сделать это, даже если я использую базовую или дайджест авторизацию?

+0

Даже если метод контроллера доступен, на сервисе может быть защищенная аннотация, а также слой DAO веб-приложения. Для такой аннотации, если условие не удовлетворено, этот метод не вызывается, и вы даже не знаете. –

+0

Я не использую аннотацию '@ Secured', если это поможет. –

+0

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

ответ

0

Вы можете написать тест, подтверждающий исход запроса определенного пути. В руководстве пользователя Spring Security имеется целый раздел: http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test. Основное внимание уделяется использованию MockMvc.

Или вы можете запустить полный тест интеграции стека, включая реальный HTTP-вызов. Пример:

@Test 
public void testHome() throws Exception { 
    HttpHeaders headers = new HttpHeaders(); 
    headers.setAccept(Arrays.asList(MediaType.TEXT_HTML)); 
    ResponseEntity<String> entity = new TestRestTemplate().exchange(
      "http://localhost:" + this.port, HttpMethod.GET, 
      new HttpEntity<Void>(headers), String.class); 
    assertEquals(HttpStatus.FOUND, entity.getStatusCode()); 
    assertTrue("Wrong location:\n" + entity.getHeaders(), 
      entity.getHeaders().getLocation().toString().endsWith(port + "/login")); 
} 
Смежные вопросы