微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在使用 SpringFox 的 Swagger Docket 配置中忽略 OAuth2 SecurityReference AuhtorizationScope

如何解决在使用 SpringFox 的 Swagger Docket 配置中忽略 OAuth2 SecurityReference AuhtorizationScope

我在为 Swagger 设置文档时遇到了在安全参考中使用 AuthorizationScope 的问题或误解。

我希望 SecurityScheme 的 AuthorizationScope 将由 SecurityReference 强制执行,但实际上它被忽略了 - 这意味着从使用 SecurityScheme 和 SecurityReference 的文档中调用我的 API 没有问题,尽管如下:

记录

public static Docket createOauth2Docket(final ApiInfo apiInfo,final String groupName,final String basePackage,final String urlPrefix,final TypeResolver typeResolver) {
    return new Docket(DocumentationType.OAS_30)
        .apiInfo(apiInfo)
        .securityContexts(Collections.singletonList(oauth2SecurityContext()))
        .securitySchemes(Collections.singletonList(oauth2SecurityScheme()))
        .groupName(groupName)
        .useDefaultResponseMessages(false)
        .globalResponses(HttpMethod.GET,getDefaultResponses())
        .globalResponses(HttpMethod.POST,getDefaultResponses())
        .globalResponses(HttpMethod.PUT,getDefaultResponses())
        .globalResponses(HttpMethod.PATCH,getDefaultResponses())
        .globalResponses(HttpMethod.DELETE,getDefaultResponses())
        .directModelSubstitute(LocalDate.class,String.class)
        .directModelSubstitute(LocalTime.class,String.class)
        .directModelSubstitute(LocalDateTime.class,String.class)
        .directModelSubstitute(Instant.class,String.class)
        .directModelSubstitute(OffsetTime.class,String.class)
        .directModelSubstitute(OffsetDateTime.class,String.class)
        .directModelSubstitute(zoneddatetime.class,String.class)
        .additionalModels(typeResolver.resolve(ErrorInfo.class))
        .genericModelSubstitutes(DeferredResult.class)
        .select()
        .apis(RequestHandlerSelectors.basePackage(basePackage))
        .paths(PathSelectors.ant(urlPrefix + "/**"))
        .build();
}

文档的安全设置

private static SecurityScheme oauth2SecurityScheme() {
    return OAuth2Scheme.OAUTH2_PASSWORD_FLOW_BUILDER
        .tokenUrl("https://****/protocol/openid-connect/token")
        .name("OAUTH2")
        .scopes(Collections.singletonList(new AuthorizationScope("openid","accessEverything")))
        .build();
}

private static SecurityContext oauth2SecurityContext() {
    return SecurityContext.builder().securityReferences(Collections.singletonList(oauth2SecurityReference())).build();
}

private static SecurityReference oauth2SecurityReference() {
    AuthorizationScope[] authScopes = new AuthorizationScope[1];
    authScopes[0] = new AuthorizationScopeBuilder()
        .scope("whatever")
        .description("accessEverything")
        .build();
    return SecurityReference.builder()
        .reference("OAUTH2")
        .scopes(authScopes)
        .build();
}

在 swagger 中,一切看起来都很好。可以选择范围并通过单击授权按钮从 SSO 获取令牌并正确发送到标头中的授权对象,前缀为 Bearer,API 返回 200。由于范围值不同,我预计会有 40 倍的未授权响应。

My swagger showcase

能否请您说明为什么会出现这种行为,或者我的期望有什么问题?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。