【swagger打不开】【SpringCloud项目】【security】

本文探讨了一个SpringCloud项目集成Oauth2和Swagger后,UI界面加载问题及解决策略。作者分享了如何通过配置Oauth2白名单和调整Swagger返回数据格式,确保文档API正常显示并避免数据被错误封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

问题背景:

  • Spring Cloud项目(但这个问题的发生和 是Cloud还是Boot 没关系),
  • 增加了spring security(Oauth2)
  • 封装了返回数据的格式

问题现象

  • 配置swagger后,发现ui无法打开,但是v2/api-docs文件还可以被返回。
  • api-doc文件的json格式外又多包裹了一层。
  • 查看console发现某些文件被拦截了

 

 

问题解决:

尝试过的对本项目无效的解决办法:

  • 将swagger版本从2.9.2 -> 2.7.2换成更低版本后,虽然ui界面无拦截弹出框,但没有任何数据。
  • 因为使用了Oauth2,所以考虑会不会把.css等一些文件拦截了,于是将各种.css, .js文件格式加入http.antMatchers白名单中

有效解决办法:

1 第一步:

将swagger返回的文件加入到Oauth2 Config白名单中:

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().cors().disable();
        http
                .authorizeRequests()
                .antMatchers(
                        "/swagger-ui.html",
                        "/webjars/**",
                        "/v2/api-docs",
                        "/swagger-resources/**",
                        "/favicon.ico"
                ).permitAll()
                .and()
                .authorizeRequests()
                .anyRequest().hasAuthority("AUTHORITY-USER");

 

2 第二步:

是因为返回的数据被封装好了,返回的ui中的body格式也默认被封装在了自设定的格式里,所以无法显示数据

因此需要在返回数据的GlobalResponseConfig里声明一下,将swagger返回的数据不要经过Response<>(body).build();的封装

// 直接返回swagger返回的数据body本身
if (body instanceof UiConfiguration) return body;
if (body instanceof SecurityConfiguration) return body;
if (body instanceof ArrayList && !((ArrayList<?>) body).isEmpty() && ((ArrayList<?>) body).get(0) instanceof SwaggerResource)
                return body;
if (body instanceof Json) return body;

// 自设定的返回数据的封装
if (body instanceof Status) return new Response<>().status((Status) body).build();
if (body instanceof Response<?>) return ((Response<?>) body).build();
                return new Response<>(body).build();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值