swagger/knife4j小事记录(三):Spring Security集成Knife4j访问授权问题及解决方案

Spring Security集成Knife4j访问授权问题及解决方案

大家好,我是欧阳方超,微信公众号同名。在这里插入图片描述

1 问题描述

在使用Spring Security的Spring Boot项目中集成了Knife4j,虽然能够访问Knife4j首页,但是后台会报如下错误:

org.springframework.security.authentication.InsufficientAuthenticationException: Full authentication is required to access this resource

2 解决方案

2.1 配置放行路径

问题的核心在于如何配置放行路径,我们一般都会在SecurityConfig类的configure方法中添加如下一行代码:

.antMatchers("/swagger-ui/**", "/v2/api-docs/**", "/doc.html", "/swagger-resources/**", "/webjars/**", "/api-docs").permitAll()

但是上面的配置只适用于原始的swagger,也就是说完成上面的配置后,能实现即使不在请求头中添加认证信息也能方式接口列表页,且后台不会有报错。但是,在Knife4j中,我们一般是请求doc.html接口的路径来访问接口列表页,看似doc.html已经添加到放行路径中了,在请求时接口列表页时,虽然也能显示出来,但是后台会报错,报错信息在本文开头已提到。原因可能是这样的,观察了一下,在使用了Knife4j的情况下请求接口列表页时,会有一个以favicon.ico结尾的请求也发出去了,应该是这个请求触发了Spring Security报错。
原因找打之后把favicon.ico加入到放行路径中,

.antMatchers("/swagger-ui/**", "/v2/api-docs/**", "/doc.html", "/favicon.ico", "/swagger-resources/**", "/webjars/**", "/api-docs").permitAll()

重启项目,发现Spring Security报错消失。

3 总结

增加了 favicon.ico 的访问许可,通过以上配置和调整,应该能够解决Spring Security环境下Knife4j的访问授权问题。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜欢我的文章,欢迎点赞、转发、评论加关注。我们下次见。

### 解决Spring SecurityKnife4j集成时无法访问资源的问题 当遇到Spring SecurityKnife4j集成导致的无法访问资源问题时,通常是因为安全配置阻止了对Swagger UI页面及其相关静态文件的访问。以下是详细的解决方案: #### 配置冲突排查 为了确保能够正常访问`/doc.html`以及其他API文档路径,在应用的安全配置类中需要特别处理这些URL模式。对于Spring Boot 2.x及以上版本的应用程序来说,可以通过自定义WebSecurityConfigurerAdapter来实现这一点。 ```java @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll() // 放开knife4j接口地址 .anyRequest().authenticated(); // 关闭csrf防护机制以便于测试环境下的api调用更加方便 http.csrf().disable(); } } ``` 上述代码片段展示了如何通过覆盖`configure(HttpSecurity)`方法并使用`antMatchers()`函数指定允许匿名访问的具体路径列表[^2]。 #### 权限设置调整 除了放开特定端点外,还需要考虑整个应用程序级别的安全性策略是否合理。如果启用了CSRF保护,则可能会影响表单提交等功能;因此可以根据实际情况决定是否禁用它(仅适用于开发阶段)。另外,考虑到前后端分离架构下跨域资源共享的需求,适当放宽CORS政策也是必要的措施之一。 针对CSP(Content Security Policy),这是一种HTTP响应头部字段,用于增强网页加载外部资源时的安全性控制。由于Knife4j依赖于JavaScript库动态渲染界面,所以应当确认服务器返回的内容安全策略不会阻碍此类操作。具体做法是在控制器层面上添加相应的header属性: ```java import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; @ControllerAdvice(basePackages = "com.example.controller") public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> { @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { return true; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { HttpServletResponse rawResponse = ((ServletServerHttpResponse)response).getServletResponse(); rawResponse.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'unsafe-inline' 'unsafe-eval'"); return body; } } ``` 这段代码实现了全局范围内的响应体拦截器,并向每个响应附加了一个较为宽松的CSP声明,从而允许执行内联脚本以及评估表达式[^3]。 最后需要注意的是,随着不同框架版本之间的差异,某些配置项可能会有所变化。例如从Spring Boot 2迁移到3的过程中遇到了兼容性问题,这可能是由新的默认行为引起或者是第方组件本身的更新所致。在这种情况下,查阅官方文档或社区反馈往往能提供有效的指导[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值