В springdocs я могу определить несколько определений OpenAPI на основе тегов операций

Мне нужно определить два разных определения OpenApi с помощью springdocs для одного и того же API в одном приложении: одно для внутренних разработчиков и одно для внешних разработчиков. Внешнее определение будет включать некоторые операции из внутреннего определения, но не все из них.

Я рассмотрел использование GroupedOpenApi для создания двух определений, но для этого мне необходимо переместить конечные точки, которые должны быть исключены из внешнего определения, в отдельный RestController и перейти в исключенный пакет, который не будет включен в определение для внешнего разработчиков, но все равно будет включено во внутреннее определение. Я бы предпочел структурировать свой код на основе определения API, а не на основе безопасного доступа для моих конечных точек.

Похоже, что либо SecurityScheme, либо теги могут использоваться для определения того, какие операции включены в данное определение, используя что-то вроде GroupedOpenApi с путями / пакетами для включения. Так, например, я мог бы определить определение своего внешнего API примерно следующим образом:

GroupedOpenApi.builder()
            .group("externalGroupName")
            .securitySchemesToInclude("externalSchemeName") // this doesn't currently exist
            .build();

И затем любая из операций, помеченных SecurityRequirement с этой SecurityScheme, будет добавлена ​​к этому внешнему определению. Так, например, у меня могут быть следующие две конечные точки, определенные в одном и том же RestController:

Будет включено:

    @SecurityRequirement(name = "externalSchemeName")
    @GET
    @Path("/pets")
    public Response getResponse(){
        return null;
    }
}

Не будут включены:

    @SecurityRequirement(name = "internalSchemeName")
    @GET
    @Path("/pets/internal")
    public Response getInternalResponse(){
        return null;
    }
}

При таком подходе было бы неплохо предусмотреть схемы безопасности включения / исключения, аналогичные путям / включениям / исключениям пакетов.

Похоже, что в настоящее время потребуется внести вклад в springdocs, если я не понимаю свои варианты создания нескольких определений. Есть ли другой способ добиться исключения операции только из одного из определений, которые я определяю, без полного сокрытия этой операции из всех определений и без реструктуризации моих пакетов?

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


person Control Complex    schedule 02.09.2020    source источник


Ответы (1)


Используя ваш пример, у вас есть другие фильтры (на основе путей) GroupedOpenApi, которые вы не использовали:

    GroupedOpenApi.builder()
            .group("internalGroupName")
            .pathsToMatch("/pets/internal")
            .build();

    GroupedOpenApi.builder()
            .group("externalGroupName")
            .pathsToMatch("/pets")
            .packagesToExclude("/pets/internal")
            .build();
person brianbro    schedule 02.09.2020
comment
Я определенно мог бы вызвать все пути в конфигурации, которые будут исключены, но для этого мне потребуется поддерживать список элементов, которые соответствуют SecurityScheme в моей конфигурации, а также в коде. Это кажется подверженным ошибкам, поскольку я могу пропустить исключение пути в конфигурации, но не пропустить его в SecurityScheme. Я бы предпочел, чтобы определение контроля доступа было в одном месте. - person Control Complex; 03.09.2020
comment
Кроме того, я думаю, что в вашем примере вы имеете в виду pathsToExclude для / pets / internal, поскольку это не пакет. Обе конечные точки из моих примеров, вероятно, будут жить в одном RestController. - person Control Complex; 03.09.2020