swagger整合shiro遇到的一些小问题

  1. 增加了@requirePermission和@requireRoles注解解的controller,swagger就读取不到了。
    这个问题我百度了挺久,没有找到答案,后来在bing上面找到了答案,在shiroConfig里面注入如下bean就行。
    /*
解决整合swagger加@requirepermission问题
  **/
    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator =
                new DefaultAdvisorAutoProxyCreator();
        defaultAdvisorAutoProxyCreator.setUsePrefix(true);
        return defaultAdvisorAutoProxyCreator;
    }

2.由于项目是前后端分离的,所以前后端的用户认证是基于token的,这就使得swagger的调试接口变得不方便了,所以为了方便调试,我在全局配置了一个请求头,在登录之后,把token填入即可。

以下是swagger的配置:

@Configuration
public class SwaggerConfig {
    private static final String SPLITOR = ",";
    @Bean
    public Docket docket(){
        Parameter token = new ParameterBuilder().name("token")  //全局参数
                .description("用户登陆令牌")
                .parameterType("header")
                .modelRef(new ModelRef("String"))
                .required(false)
                .build();
        Parameter loginType = new ParameterBuilder().name("loginType")  //全局参数
                .description("用户登陆类型")
                .parameterType("header")
                .modelRef(new ModelRef("String"))
                .allowableValues(new AllowableListValues( Arrays.asList("ADMIN","USER"),"String"))
                .required(true)
                .build();
        ArrayList<Parameter> parameters = new ArrayList<>();
    //    parameters.add(token);
        parameters.add(loginType);
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .globalOperationParameters(parameters)
                .select()
                //配置当前扫描接口的方式
                //basepackage指定扫描的包
                //any()扫描全部
                //none不扫描
                //withclassannotation扫描类上的注解
                //withmethodannotation扫描方法上的注解
//                .apis(RequestHandlerSelectors.basePackage("com.zhang.swagger.controller"))
                .paths(PathSelectors.any())//过滤
                .build()
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }
    private ApiInfo apiInfo()
    {//作者信息
        Contact contact = new Contact("sln","******","*******");
        return  new ApiInfo("sln的API文档", "Api接口调用", "1.0", "********", contact, "Apache 2.0", "http://www.apache.org/licenses/LICENSE-2.0", new ArrayList());

    }
    /**
     * 重写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;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值