Хобрук: Ваш путь к мастерству в программировании

Swagger-ui с безопасностью Spring

У меня есть простое приложение REST со службой аутентификации. Я пытался добавить к нему swagger и swagger-ui, но вижу свои конечные точки только в /v2/api-docs. В swagger-ui.html я вижу только группы конечных точек, но не могу расширить список.

В отладке хрома я вижу:

Не удалось загрузить ресурс: сервер ответил со статусом 401 ()

Uncaught TypeError: невозможно прочитать свойство indexOf неопределенного

и на терминале с сервером:

ОШИБКА 10020 --- [nio-5001-exec-3] c.t.r.a.p.JwtAuthenticationEntryPoint: ответ с несанкционированной ошибкой. Сообщение. Для доступа к этому ресурсу требуется полная аутентификация.

Похоже, что в моих конфигурационных файлах чего-то не хватает, я попробовал несколько решений, которые нашел в Интернете, но все равно ничего не работает.

Это мой код:

помпон

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.9.2</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.9.2</version>
</dependency>

контроллер

@RestController
@PreAuthorize("hasRole('USER')")
@RequestMapping(path = "restaurant")
@Api(value="restaurant", description="Example operations for restaurants")
public class RestaurantController {
// endpoints
}

чванливая фасоль

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.tablebooker.restaurantservice.restaurant"))
                .paths(PathSelectors.any())
                .build();
    }
}

SecurityConfig

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(
        securedEnabled = true,
        jsr250Enabled = true,
        prePostEnabled = true
)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//other methods

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(unauthorizedHandler)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                .permitAll()
                .antMatchers("/api/auth/**")
                .permitAll()
                .antMatchers("/restaurant/**")
                .hasRole("USER")
                .anyRequest()
                .authenticated();

        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources", "/configuration/security", "/swagger-ui.html", "/webjars/**");
    }
}

Любые идеи, как я могу заставить мою конфигурацию работать?


Ответы:


1

Сначала вы должны зарегистрировать ресурсы swagger.

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
    }
}

Тогда, поскольку вы используете Spring Security, возможно, вам следует отключить привилегии.

   @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().mvcMatchers(HttpMethod.OPTIONS, "/**");
        // ignore swagger 
        web.ignoring().mvcMatchers("/swagger-ui.html/**", "/configuration/**", "/swagger-resources/**", "/v2/api-docs");
    }

И, может быть, вам лучше использовать swagger, версия которого ниже 2.8.0, или вам, возможно, придется столкнуться с множеством ошибок.

20.11.2018

2

Для меня не было проблем в традиционном развертывании Weblogic без упоминания @Override public void configure(WebSecurity web) throws Exception ...Только @Override protected void configure(HttpSecurity http) throws Exception было достаточно, и пользовательский интерфейс был виден на чванстве.

Но тот же код не работал на сервере Apache Tomcat, поэтому был необходим приведенный ниже код,

@Override public void configure(WebSecurity web) throws Exception { web.ignoring().mvcMatchers(HttpMethod.OPTIONS, "/**"); // ignore swagger web.ignoring().mvcMatchers("/swagger-ui.html/**", "/configuration/**", "/swagger-resources/**", "/v2/api-docs","/webjars/**"); }

/webjars/** отсутствует в ответе AokoQin.

Отвечаю здесь, потому что я не сталкивался с какими-либо проблемами в Weblogic без вышеуказанного кода, а только с Tomcat. У меня уже были ресурсы, добавленные через ResourceHandlerRegistry в конфигурации mvc.

06.12.2018

3

Предыдущие ответы мне помогли, но они не совсем полные/устаревшие. Я столкнулся с той же проблемой, и теперь она работает:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurationSupport {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  ...

  @Override
  public void configure(WebSecurity web) throws Exception {
    web
      .ignoring()
        .mvcMatchers("/swagger-ui.html/**", "/configuration/**", "/swagger-resources/**", "/v2/api-docs", "/webjars/**");
  }

  ...

}
07.01.2021
  • Я попробовал это, и это приблизило меня. Появляется часть чванливого пользовательского интерфейса, давая мне знакомую зеленую полосу. Но внизу написано 401: {отметка времени:2021-01-15T07:09:06.524+0000,статус:401,ошибка:Неавторизовано,сообщение:Для доступа к этому ресурсу требуется полная аутентификация,путь:/NeptuneDreams/CustomerOrders/1.0. 0/api-docs} localhost:8080/NeptuneDreams/CustomerOrders/1.0.0/ API-документы 15.01.2021
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..