接口方法上使用@PreAuthorize注解,Swagger UI 为什么不显示该接口?
1 问题描述
接口方法上使用@PreAuthorize
注解,Swagger UI 上就不显示该接口;
如果删除方法上的所有@PreAuthorize
注解,Swagger UI 上就显示这个接口了。
SecurityConfig已经放行了 Swagger 资源,如何使用 @PreAuthorize
注解,还能被 Swagger 扫描到?
2 相关代码
Swagger: 2.9.2
SpringBoot: 2.1.3.RELEASE
2.1 接口
@Api(value = "用户接口", tags = "User-API")
public interface UserApi {
/**
* 获取用户列表
*/
@ApiOperation(value = "获取用户列表", notes = "获取用户列表")
@GetMapping("/user/list")
@PreAuthorize("hasRole('ROLE_SYSTEM')")
ResultVO getUserList(@RequestBody UserReqVO userReqVO, Page<SysLogin> page);
@PreAuthorize("hasRole('ROLE_SYSTEM')")
会导致这个接口不在 Swagger UI 显示,去了就能显示。
2.2 Swagger2Config
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.useDefaultResponseMessages(false)
.forCodeGeneration(true)
.pathMapping("/")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.xxx"))
.paths(PathSelectors.any())
.build()
.globalOperationParameters(this.operationParameters());
}
2.3 SecurityConfig
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.cors().and().csrf().disable()
.authorizeRequests()
// Swagger2
.antMatchers("/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/webjars/springfox-swagger-ui/**").permitAll()
// 其他所有请求需要身份认证
.anyRequest().authenticated()
.and()
.logout().permitAll();
// 开启登录认证流程过滤器
httpSecurity.addFilterBefore(new JwtLoginFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class);
// 访问控制时登录状态检查过滤器
httpSecurity.addFilterBefore(new JwtAuthenticationFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class);
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers( "/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/webjars/springfox-swagger-ui/**");
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题已解决。
代理的问题,使用 CGLIB 代理即可,如下:
参考:https://stackoverflow.com/que...