Swagger统一Authorization认证

在这里插入图片描述

Swagger统一Authorization认证


在这里插入图片描述

在这里插入图片描述

摘自: https://blog.csdn.net/qq_23035335/article/details/102772428.


1. Swagger Authorization

在这里插入图片描述

2. Code

package cn.fc.swagger2;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * api页面 /swagger-ui.html
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Value("${jwt.header}")
    private String tokenHeader;

    @Value("${swagger.enabled}")
    private Boolean enabled;

    @Value("${swagger.host}")
    private String host;

    private static final String SPLITOR = ",";

    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(enabled)
                .apiInfo(apiInfo())
                //拼接路径,这个就相当于给swagger测试接口时,在发送的请求地址前增加这个配置的路径,实际根本就不需要,就算项目本身是配了根路径,这里也不需要配置,否则会重复
//                .pathMapping("fcadmin")
                // 必须得配这个,不然默认就是localhost,一但部署到其他服务器上,就会出现测试接口执行时访问路径不对,例如:这个项目就出出现路径是 http://fcadmin/fcadmin/api/device
                .host(host)
                // 选择哪些路径和api会生成document
                .select()
                // 指定只扫描哪些包下面的API生成接口文档,重复写会导致一个都不会扫描
//                .apis(RequestHandlerSelectors.basePackage("cn.fc.modules.bus.device.rest"))
//                .apis(RequestHandlerSelectors.basePackage("cn.fc.modules.system.rest"))
                //调用重写的方法,支持扫描多个包
                .apis(basePackage("cn.fc.modules.bus" + SPLITOR + "cn.fc.modules.system.rest"))
                .paths(Predicates.not(PathSelectors.regex("/error.*")))
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }

    /**
     * 重写basePackage方法,让swagger支持多个包扫描
     * @param basePackage
     * @return
     */
    public static Predicate<RequestHandler> basePackage(final String basePackage) {
        return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
    }

    private static Function<Class<?>, Boolean> handlerPackage(final String basePackage)     {
        return input -> {
            // 循环判断匹配
            for (String strPackage : basePackage.split(SPLITOR)) {
                boolean isMatch = input.getPackage().getName().startsWith(strPackage);
                if (isMatch) {
                    return true;
                }
            }
            return false;
        };
    }

    private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
        return Optional.fromNullable(input.declaringClass());
    }

    /**
     * 设置完成后进入SwaggerUI,右上角出现“Authorization”按钮,点击即可输入我们配置的认证参数。
     * 对于不需要输入参数的接口(上文所述的包含auth的接口),在未输入Authorization参数就可以访问。
     * 其他接口则将返回401错误。点击右上角“Authorization”按钮,输入配置的参数后即可通过认证访问。参数输入后全局有效,无需每个接口单独输入。
     * 通过Swagger2的securitySchemes配置全局参数:如下列代码所示,securitySchemes的ApiKey中增加一个名为“Authorization”,type为“header”的参数。
     * @return
     */
    private List<ApiKey> securitySchemes() {
        List<ApiKey> apiKeyList = new ArrayList<>();
        apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));
        return apiKeyList;
    }

    /**
     * 在Swagger2的securityContexts中通过正则表达式,设置需要使用参数的接口(或者说,是去除掉不需要使用认证参数的接口),
     * 如下列代码所示,通过PathSelectors.regex("^(?!auth).*$"),所有包含"auth"的接口不需要使用securitySchemes。
     * 即不需要使用上文中设置的名为“Authorization”,type为“header”的认证参数。
     * 通俗讲,就是能匹配上的就使用默认认证,就不使用header里面的Authorization认证参数
     */
    private List<SecurityContext> securityContexts() {
        List<SecurityContext> securityContexts = new ArrayList<>();
        securityContexts.add(SecurityContext.builder()
                .securityReferences(defaultAuth())
                .forPaths(PathSelectors.regex("^(?!auth).*$"))
                .build());
        return securityContexts;
    }

    List<SecurityReference> defaultAuth() {
        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
        AuthorizationScope[] authorizationScopes = {authorizationScope};
        List<SecurityReference> securityReferences = new ArrayList<>();
        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
        return securityReferences;
    }


    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title("fcadmin 接口文档")
                .version("1.0.0")
                .build();
    }

}

3.Awakening

         在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人,自然是不一样的命运。
在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Swagger 3. 可以通过在请求头中添加 Authorization 字段来统一添加 token。具体操作步骤如下: 1. 在 Swagger UI 中找到需要添加 token 的接口,点击右侧的“Authorize”按钮。 2. 在弹出的窗口中输入 token,并选择 token 的类型(如 Bearer Token)。 3. 点击“Authorize”按钮,完成 token 的添加。 4. 在请求接口时,Swagger 会自动在请求头中添加 Authorization 字段,并将 token 值添加到其中。 需要注意的是,每次添加 token 后,Swagger UI 会将 token 保存在浏览器的本地存储中,下次访问接口时会自动加载上次保存的 token。如果需要更换 token,可以再次点击“Authorize”按钮,输入新的 token 并保存。 ### 回答2: Swagger3.0是目前市场上使用最为广泛的API文档工具和规范。使用Swagger可以帮助我们更加高效地管理和维护API文档,使得API的开发和调用变得更加方便。在实际的项目中,很多API需要使用token来进行身份验证,保障API的安全性。 为了统一添加token,我们需要在Swagger3.0配置文件中进行相应的设置。首先,我们需要在Swagger的全局配置中添加Authorization header,如下所示: ```yaml swagger: "3.0" info: title: My API version: 1.0.0 description: My API Description servers: - url: http://localhost:8080 description: Local Server security: - bearerAuth: [] components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT ``` 在上述配置中,我们使用了OpenAPI 3.0的security配置,其中bearerAuth是自定义的名称,我们需要确保这个名称与下面的实际使用一致。在components里面我们定义了securitySchemes,使用JWT作为token传递方式。这样使用者就可以通过在请求header中添加Authorization属性来进行token认证了。 接下来,我们需要在API接口的具体定义中进行配置。例如,下面展示了一个获取用户信息的API: ```yaml paths: /users/{userId}: get: summary: Get user by ID parameters: - in: path name: userId required: true schema: type: integer format: int64 responses: '200': description: Successful operation content: application/json: schema: $ref: '#/components/schemas/UserResponse' security: - bearerAuth: [] ``` 在这个示例API中,我们添加了security配置并指定了它所属的securitySchemes为bearerAuth。这样我们在访问该API时就必须携带token认证才能成功访问。 总之,通过上述配置我们可以在Swagger3.0中统一添加token,保障我们API的安全性。同时,我们也可以在Swagger的UI界面中方便的进行API测试和调试。在实际的API开发中,我们可以通过结合各种框架和工具,实现更加灵活的API管理和调用。 ### 回答3: Swagger3.0 是一种基于标准 OpenAPI 规范的 API 文档框架,可以快速地生成并描述 REST API 的接口文档,其可读性、可维护性和可测试性都比较高。而对于需要进行用户认证与授权的 API 接口来说,就需要采用一些安全机制以确保 API 请求的合法性。其中,token 就是一种常用的认证方式。 在 Swagger3.0 中统一添加 token 的方式可以通过以下几步实现: 1.在项目的 pom.xml 文件中添加依赖: ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> ``` 2.在 Swagger3.0 的启动配置文件中添加以下代码: ```java @Configuration @EnableSwagger2WebFlux public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) .build() .securitySchemes(Arrays.asList(apiKey())) .securityContexts(Arrays.asList(securityContext())); } private ApiKey apiKey() { return new ApiKey("token", "token", "header"); } private SecurityContext securityContext() { return SecurityContext.builder() .securityReferences(Arrays.asList(new SecurityReference("token", new AuthorizationScope[]{}))) .build(); } @Bean public SecurityConfiguration security() { return SecurityConfigurationBuilder.builder() .clientId("test-app-client-id") .clientSecret("test-app-client-secret") .realm("test-app-realm") .appName("test-app") .scopeSeparator(",") .additionalQueryStringParams(null) .useBasicAuthenticationWithAccessCodeGrant(false) .build(); } } ``` 其中,ApiKey 主要定义了 token 的名称、位置和类型;SecurityContext 主要定义了针对哪些路径使用 token 认证;SecurityConfiguration 定义了客户端的相关信息和授权方式。 3.在 API 接口中添加 @ApiOperation(value = "xxx", authorizations = {@Authorization(value="token")}) 注解,如: ```java @ApiOperation(value = "get user info", authorizations = {@Authorization(value="token")}) @GetMapping("/user/info") public String getUserInfo(HttpServletRequest request) { // 此处添加验证逻辑 return "user info"; } ``` 经过以上配置,Swagger3.0 就会要求在请求头中添加名为 token 的参数,并进行认证,才能访问包含 @ApiOperation(value = "xxx", authorizations = {@Authorization(value="token")}) 注解的 API 接口。这样可以提高 API 接口的安全性,阻止未授权的访问,从而保护用户的数据安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百世经纶『一页書』

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值