Безопасный пользовательский интерфейс Springfox Swagger2

Я использую springfox swagger2, и он работает правильно. Это была просто базовая установка / конфигурация, так как я действительно новичок в чванстве.

Но он доступен всем, у кого есть URL.

Я бы хотел, чтобы он не был доступен для всех, и иметь экран входа в систему (обычная проверка подлинности или проверка подлинности Google) было бы действительно здорово.

Я искал в Интернете, но, похоже, я не могу найти что-то конкретное для springfox-swagger2. Я могу найти некоторые, но, похоже, это для .Net (образцы на основе C#).

Обновлять

Я могу получить доступ к swagger-ui.html, если установлю этот .antMatchers("/swagger-ui.html**").permitAll() в класс SecurityConfig.

Но если я изменю его на .authenticated(), этого не произойдет, и я получаю установленную мной ошибку 401:

{"timestamp":"2018-09-03T06:06:37.882Z","errorCode":401,"errorMessagesList":[{"message":"Unauthorized access"}]}

Кажется, он попадает в точку входа в мою аутентификацию. Если бы я мог сделать только swagger-ui.html (или swagger в целом) доступным только для всех аутентифицированных пользователей (на данный момент и будет основываться на ролях позже).

Я не уверен, нужно ли мне добавить некоторую конфигурацию безопасности на SwaggerConfig.java, поскольку мне нужно только сделать swagger-ui.html доступным для аутентифицированных пользователей (или определенных ролей / полномочий).

Зависимость (pom.xml):

<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger2</artifactId>
  <version>2.8.0</version>
</dependency>

Класс конфигурации безопасности

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    ...

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        JWTAuthenticationFilter authenticationFilter =
                new JWTAuthenticationFilter(authenticationManager(), appContext);
        authenticationFilter.setFilterProcessesUrl("/auth/form");

        JWTAuthorizationFilter authorizationFilter =
                new JWTAuthorizationFilter(authenticationManager(), appContext);

        http
            .cors().and().csrf().disable() // no need CSRF since JWT based authentication
            .authorizeRequests()

            ...

            .antMatchers("/swagger-ui.html**").authenticated()

            ...

            .anyRequest().authenticated()

            .and()
                .addFilter(authenticationFilter)
                .addFilter(authorizationFilter)

            // this disables session creation on Spring Security
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)

            .and().exceptionHandling().authenticationEntryPoint(new MyAuthenticationEntryPoint());
    }

    ...

}

MyAuthenticationEntryPoint

@Component
public class MyAuthenticationEntryPoint implements AuthenticationEntryPoint {

    private final Logger logger = LoggerFactory.getLogger(MyAuthenticationEntryPoint.class);

    @Override
    public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
            AuthenticationException e) {
        logger.debug("Pre-authenticated entry point called. Rejecting access");
        List<Message> errorMessagesList = Arrays.asList(new Message("Unauthorized access"));
        CommonErrorResponse commonErrorResponse =
                new CommonErrorResponse(errorMessagesList, HttpServletResponse.SC_UNAUTHORIZED);
        try {
            String json = Util.objectToJsonString(commonErrorResponse);
            httpServletResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            httpServletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
            httpServletResponse.setCharacterEncoding(StandardCharsets.UTF_8.toString());
            httpServletResponse.getWriter().write(json);
        } catch (Exception e1) {
            logger.error("Unable to process json response: " + e1.getMessage());
        }
    }

}

Конфигурация Swagger

@EnableSwagger2
@Configuration
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfig {

    @Bean
    public Docket api() {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(metadata())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.iyotbihagay.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    private ApiInfo metadata() {
        return new ApiInfoBuilder().title("Iyot Bihagay API Documentation")
                .description("API documentation for Iyot Bihagay REST Services.").version("1.6.9").build();
    }

}

Я думаю, что это возможно с помощью springfox, поскольку я вижу это в другой версии, такой как .net.

Надеюсь, кто-то сможет поделиться с вами светом, как защитить пользовательский интерфейс Swagger (springfox-swagger2).

Кстати, я использую JWT для своих API, и он работает. Что касается чванства, он работает, если я установил его на permitAll().
Не работает, если поменять на authenticated().
Если он работает с authenticated(), я попытаюсь применить проверки ролей / полномочий.

Спасибо!

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
0
1 651
1

Ответы 1

Добавьте Spring безопасность в свой проект, создайте «DEVELOPER_ROLE», и пользователь с этой ролью, а затем настройте вашу веб-безопасность, будет выглядеть примерно так:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {

    //swagger-ui resources
    private static final String[] DEVELOPER_WHITELIST = {"/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs"};
    //site resources
    private static final String[] AUTH_HTTP_WHITELIST = {"/path1", "/path2"}; // allowed
    private static final String LOGIN_URL = "/login.html"; // define login page
    private static final String DEFAULT_SUCCESS_URL = "/index.html"; // define landing page after successful login 
    private static final String FAILURE_URL = "/loginFail.html"; // define failed login page/path

    @Override
    protected void configure(final HttpSecurity http) throws Exception {

        http
                .authorizeRequests()
                .antMatchers(AUTH_HTTP_WHITELIST).permitAll()
                .antMatchers(DEVELOPER_WHITELIST).hasRole("DEVELOPER") // for role "DEVELOPER_ROLE"
                .anyRequest()..authenticated()
                .and()
                .formLogin()
                .loginPage(LOGIN_URL)
                .defaultSuccessUrl(DEFAULT_SUCCESS_URL)
                .failureUrl(FAILURE_URL)
                .permitAll()
                .and()
                .logout()
                .logoutSuccessUrl(LOGIN_URL)
                .permitAll();
    }

}

Вот руководство с примерами: https://www.baeldung.com/spring-security-authentication-and-registration

Спасибо, братан, я попробовал, но это не сработало. Работает только permitAll(). authenticated() и hasAnyAuthority() нет. Я не знаю, нужно ли мне что-то менять в конфигурации swagger, чтобы это работало.

Borgy Manotoy 02.10.2018 09:23

Другие вопросы по теме