当前位置: 首页 > 知识库问答 >
问题:

Spring boot+Swagger UI如何告诉endpoint需要承载令牌

王弘和
2023-03-14

我正在使用Spring Boot构建一个REST API。我添加了Swagger-ui来处理文档。我在实现客户机身份验证流到swagger时遇到了一个问题,问题是我可以通过基本auth让swagger-ui授权提供的客户机ID(用户名)和客户机机密(密码),但swagger UI似乎没有应用到endpoint调用的结果访问令牌。

确认,我的授权过程;-使用basic auth将base64编码的用户名/密码&grant_type=client_credentials发送到/oauth/token。Spring返回access_token-在以后的API调用中,使用提供的access_token作为承载令牌

我认为问题可能是因为我需要在控制器中的每个方法上放置一些东西,以告诉swaggerendpoint需要身份验证和什么类型,但我找不到任何关于如何做到这一点的明确文档,也不知道是否需要对swagger配置应用任何进一步的更改。

这里有一个控制器的例子(为了减小大小,删除了大多数方法);

@Api(value="Currencies", description="Retrieve, create, update and delete currencies", tags = "Currencies")
@RestController
@RequestMapping("/currency")
public class CurrencyController {

    private CurrencyService currencyService;

    public CurrencyController(@Autowired CurrencyService currencyService) {
        this.currencyService = currencyService;
    }

    /**
     * Deletes the requested currency
     * @param currencyId the Id of the currency to delete
     * @return 200 OK if delete successful
     */
    @ApiOperation(value = "Deletes a currency item", response = ResponseEntity.class)
    @RequestMapping(value="/{currencyId}", method=RequestMethod.DELETE)
    public ResponseEntity<?> deleteCurrency(@PathVariable("currencyId") Long currencyId) {
        try {
            currencyService.deleteCurrencyById(currencyId);
        } catch (EntityNotFoundException e) {
            return new ErrorResponse("Unable to delete, currency with Id " + currencyId + " not found!").response(HttpStatus.NOT_FOUND);
        }

        return new ResponseEntity(HttpStatus.OK);
    }

    /**
     * Returns a single currency by it's Id
     * @param currencyId the currency Id to return
     * @return the found currency item or an error
     */
    @ApiOperation(value = "Returns a currency item", response = CurrencyResponse.class)
    @RequestMapping(value="/{currencyId}", method = RequestMethod.GET, produces = "application/json")
    public ResponseEntity<RestResponse> getCurrency(@PathVariable("currencyId") Long currencyId) {
        Currency currency = null;

        try {
            currency = currencyService.findById(currencyId);
        } catch (EntityNotFoundException e) {
            return new ErrorResponse("Currency with Id " + currencyId + " could not be found!").response(HttpStatus.NOT_FOUND);
        }

        return new CurrencyResponse(currency).response(HttpStatus.OK);
    }

    /**
     * Returns a list of all currencies available in the system
     * @return Rest response of all currencies
     */
    @ApiOperation(value = "Returns a list of all currencies ordered by priority", response = CurrencyListResponse.class)
    @RequestMapping(value="", method=RequestMethod.GET, produces="application/json")
    public ResponseEntity<RestResponse> getCurrencies() {
        return new CurrencyListResponse(currencyService.getAllCurrencies()).response(HttpStatus.OK);
    }

}

这是我目前的大摇大摆的配置;

@Configuration
@EnableSwagger2
public class SwaggerConfig extends WebMvcConfigurationSupport {

    @Bean
    public SecurityConfiguration security() {
        return SecurityConfigurationBuilder.builder()
                .clientId("12345")
                .clientSecret("12345")
                .scopeSeparator(" ")
                .useBasicAuthenticationWithAccessCodeGrant(true)
                .build();
    }

    @Bean
    public Docket productApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xompare.moo.controllers"))
                .build()
                .securitySchemes(Arrays.asList(securityScheme()))
                .securityContexts(Arrays.asList(securityContext()))
                .apiInfo(metaData());

    }

    private SecurityContext securityContext() {
        return SecurityContext.builder()
                .securityReferences(Arrays.asList(new SecurityReference("spring_oauth", scopes())))
                .forPaths(PathSelectors.regex("/.*"))
                .build();
    }

    private AuthorizationScope[] scopes() {
        AuthorizationScope[] scopes = {
                new AuthorizationScope("read", "for read operations"),
                new AuthorizationScope("write", "for write operations") };
        return scopes;
    }

    public SecurityScheme securityScheme() {
        GrantType grantType = new ClientCredentialsGrant("http://localhost:8080/oauth/token");

        SecurityScheme oauth = new OAuthBuilder().name("spring_oauth")
                .grantTypes(Arrays.asList(grantType))
                .scopes(Arrays.asList(scopes()))
                .build();
        return oauth;
    }

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

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

在这一点上,通过spring进行身份验证非常有效,我唯一的问题是让它与Swagger UI一起工作。

共有1个答案

包谭三
2023-03-14

我认为您需要在您的密钥前面添加“承载”,就像这篇文章所示:Spring Boot&Swagger UI。设置JWT令牌

 类似资料:
  • 使用Vue。js我试图用Spring Boot在RESTful API中实现JWT登录表单,但除非我向请求中添加承载令牌,否则我得到的只是403状态。我已经将endpoint设置为无需任何许可即可访问,并且在postman上可以在没有授权标头的情况下发送请求。这是我在Spring上的安全配置的一部分: 这就是vue。我发出发帖请求的js服务: 我想这样做,这样就不需要令牌来访问您请求相同令牌的部分

  • 我正在尝试调用我已被指示的API: 这需要一个授权头:承载访问令牌。 我有承载访问令牌,并尝试通过邮递员,并通过C#使用WebRequest,没有任何效果。 在Postman中,我将方法设置为GET,将授权设置为No Auth,在Headers选项卡上,我尝试添加一个标题,如下所示: 标头:“授权” 值:“我的令牌” 我也尝试过 标题:“Bearer”值:“mytoken” 也 标头:“授权” 值

  • 我有以下配置: 我找到了解决方法——用以下方法标记每个独立endpoint: 但我不喜欢做这种重复的工作。 是否有一种方法可以使每个其他端都实现全球化?

  • 一个可能有高级答案的简单问题。 问题是:我的问题是,有没有办法在应用程序上下文中仅实例化特定JUnit测试所需的类? 原因:我的应用程序上下文变得相当大。我还做了很多集成测试,所以当我说每次我运行测试时,我的应用程序上下文中的所有类都会被实例化,这需要时间。 示例: 说类Foo注入只有酒吧 但是应用程序上下文有bean foobar和bar。我知道这不是一个有效的应用程序上下文,但rest确保我的

  • 理想情况下,我们希望添加一个任务,用于下载项目的第一级和可传递依赖项的所有源JAR。有办法做到这一点吗? 现在看来,这应该是默认的,至少对于第一级依赖项是这样,因为它提供了eclipse中的javadoc,这在完成代码时是非常好的。

  • 我正在为一个全新的前端添加JWT认证到一个遗留的Rails后端。 根据 HTTP 请求,似乎大多数消息来源都建议我通过持有者标头将令牌发送回服务器。 为什么?通过报头发送的附加价值是什么(承载或基本)。我不能简单地把JWT传回到服务器。json并在那里验证令牌。 Authorization标头给我带来了什么好处,更重要的是,Bearer Authorize标头给了我什么好处? 我当然可以简单地效仿