一,swagger有哪些环节需要注意安全?

1,生产环境中,要关闭swagger

application.properties中配置:

springfox.documentation.swagger-ui.enabled=false

2,swagger使用一台专用的服务器来部署,

可以访问的ip地址要做限制,

外部的防火墙和应用中都做限制,

3,自定义访问swagger的url

4, 可以访问swagger的用户要做权限的验证

说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

对应的源码可以访问这里获取: https://github.com/liuhongdi/

说明:作者:刘宏缔 邮箱: 371125307@qq.com

二,演示项目的相关信息

1,项目地址

  1. https://github.com/liuhongdi/swagger3security

2,项目功能说明:

演示了swagger3的安全配置

3,项目结构:如图:

三,配置文件说明

1,pom.xml

  1. <!-- swagger3 begin -->
  2. <dependency>
  3. <groupId>io.springfox</groupId>
  4. <artifactId>springfox-boot-starter</artifactId>
  5. <version>3.0.0</version>
  6. </dependency>
  7. <!-- spring security -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-security</artifactId>
  11. </dependency>

2,application.properties

  1. #error
  2. server.error.include-stacktrace=always
  3. #error
  4. logging.level.org.springframework.web=trace
  5. #swagger,使可用
  6. springfox.documentation.swagger-ui.enabled=true
  7. #改变url
  8. springfox.documentation.swagger-ui.base-url=/lhddoc
  9. #设置允许访问的ip地址白名单
  10. swagger.access.iplist = 192.168.3.1,127.0.0.1

四,java代码说明

1,Swagger3Config.java

  1. @EnableOpenApi
  2. @Configuration
  3. public class Swagger3Config implements WebMvcConfigurer {
  4.  
  5. @Bean
  6. public Docket createRestApi() {
  7. //返回文档摘要信息
  8. return new Docket(DocumentationType.OAS_30)
  9. .apiInfo(apiInfo())
  10. .select()
  11. //.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  12. .apis(RequestHandlerSelectors.withMethodAnnotation(Operation.class))
  13. .paths(PathSelectors.any())
  14. .build()
  15. .globalRequestParameters(getGlobalRequestParameters())
  16. .globalResponses(HttpMethod.GET, getGlobalResonseMessage())
  17. .globalResponses(HttpMethod.POST, getGlobalResonseMessage());
  18. }
  19.  
  20. //生成接口信息,包括标题、联系人等
  21. private ApiInfo apiInfo() {
  22. return new ApiInfoBuilder()
  23. .title("Swagger3接口文档")
  24. .description("如有疑问,请联系开发工程师老刘。")
  25. .contact(new Contact("刘宏缔", "https://www.cnblogs.com/architectforest/", "371125307@qq.com"))
  26. .version("1.0")
  27. .build();
  28. }
  29.  
  30. //生成全局通用参数
  31. private List<RequestParameter> getGlobalRequestParameters() {
  32. List<RequestParameter> parameters = new ArrayList<>();
  33. parameters.add(new RequestParameterBuilder()
  34. .name("appid")
  35. .description("平台id")
  36. .required(true)
  37. .in(ParameterType.QUERY)
  38. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  39. .required(false)
  40. .build());
  41. parameters.add(new RequestParameterBuilder()
  42. .name("udid")
  43. .description("设备的唯一id")
  44. .required(true)
  45. .in(ParameterType.QUERY)
  46. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  47. .required(false)
  48. .build());
  49. parameters.add(new RequestParameterBuilder()
  50. .name("version")
  51. .description("客户端的版本号")
  52. .required(true)
  53. .in(ParameterType.QUERY)
  54. .query(q -> q.model(m -> m.scalarModel(ScalarType.STRING)))
  55. .required(false)
  56. .build());
  57. return parameters;
  58. }
  59.  
  60. //生成通用响应信息
  61. private List<Response> getGlobalResonseMessage() {
  62. List<Response> responseList = new ArrayList<>();
  63. responseList.add(new ResponseBuilder().code("404").description("找不到资源").build());
  64. return responseList;
  65. }
  66. }

配置swagger3

2,HomeController.java

  1. @Api(tags = "首页信息管理")
  2. @Controller
  3. @RequestMapping("/home")
  4. public class HomeController {
  5.  
  6. @Operation(summary = "session详情")
  7. @GetMapping("/session")
  8. @ResponseBody
  9. public String session() {
  10. HttpSession session = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest().getSession();
  11. Enumeration e = session.getAttributeNames();
  12. String s = "";
  13. while( e.hasMoreElements()) {
  14. String sessionName=(String)e.nextElement();
  15. s += "name="+sessionName+";<br/>";
  16. s += "value="+session.getAttribute(sessionName)+";";
  17. }
  18. return s;
  19. }
  20.  
  21. }

查看当前登录用户的session

3,SecurityConfig.java

  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4.  
  5. @Value("${swagger.access.iplist}")
  6. private String iplist;
  7.  
  8. @Override
  9. protected void configure(HttpSecurity http) throws Exception {
  10. //得到iplist列表
  11. String iprule = "";
  12. //hasIpAddress('10.0.0.0/16') or hasIpAddress('127.0.0.1/32')
  13. String[] splitAddress=iplist.split(",");
  14. for(String ip : splitAddress){
  15. if (iprule.equals("")) {
  16. iprule = "hasIpAddress('"+ip+"')";
  17. } else {
  18. iprule += " or hasIpAddress('"+ip+"')";
  19. }
  20. }
  21. String swaggerrule = "hasAnyRole('ADMIN','DEV') and ("+iprule+")";
  22.  
  23. //login和logout
  24. http.formLogin()
  25. .defaultSuccessUrl("/home/session")
  26. .failureUrl("/login-error.html")
  27. .permitAll()
  28. .and()
  29. .logout();
  30.  
  31. //匹配的页面,符合限制才可访问
  32. http.authorizeRequests()
  33. //.antMatchers("/actuator/**").hasIpAddress("127.0.0.1")
  34. //.antMatchers("/admin/**").access("hasRole('admin') and (hasIpAddress('127.0.0.1') or
    //hasIpAddress('192.168.1.0/24') or hasIpAddress('0:0:0:0:0:0:0:1'))");
  35. .antMatchers("/lhddoc/**").access(swaggerrule)
  36. .antMatchers("/goods/**").hasAnyRole("ADMIN","DEV");
  37.  
  38. //剩下的页面,允许访问
  39. http.authorizeRequests().anyRequest().permitAll();
  40. }
  41.  
  42. @Autowired
  43. public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
  44. //添加两个账号用来做测试
  45. auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
  46. .withUser("lhdadmin")
  47. .password(new BCryptPasswordEncoder().encode("123456"))
  48. .roles("ADMIN","USER")
  49. .and()
  50. .withUser("lhduser")
  51. .password(new BCryptPasswordEncoder().encode("123456"))
  52. .roles("USER");
  53. }
  54. }

spring security的配置,重点是ip地址白名单的限制要加入

4,Goods.java等,可以从github.com查看

五,测试效果

1,无权限的访问效果:

用lhduser账号登录

从session页面可以看到当前登录用户的授权角色是:ROLE_USER

因为没有权限,访问swagger时会报错

2,有权限访问时的效果:

用lhdadmin登录

查看session:

可以看到用户权限包括:ROLE_ADMIN

访问swagger:

  1. http://127.0.0.1:8080/lhddoc/swagger-ui/

返回:

3,从非授权的ip地址访问:

既使用获得授权的用户账号登录也会报错,因为ip未授权

六,查看spring boot的版本

  1. . ____ _ __ _ _
  2. /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
  3. ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
  4. \\/ ___)| |_)| | | | | || (_| | ) ) ) )
  5. ' |____| .__|_| |_|_| |_\__, | / / / /
  6. =========|_|==============|___/=/_/_/_/
  7. :: Spring Boot :: (v2.3.3.RELEASE)

spring boot:swagger3的安全配置(swagger 3.0.0 / spring security / spring boot 2.3.3)的更多相关文章

  1. 006-Spring Boot自动配置-Condition、Conditional、Spring提供的Conditional自动配置

    一.接口Condition.Conditional(原理) 主要提供一下方法 boolean matches(ConditionContext context, AnnotatedTypeMetada ...

  2. spring多个定时任务quartz配置

    spring多个定时任务quartz配置 <?xml version=”1.0″ encoding=”UTF-8″?> <beans xmlns=”http://www.spring ...

  3. spring boot:swagger3文档展示分页和分栏的列表数据(swagger 3.0.0 / spring boot 2.3.3)

    一,什么情况下需要展示分页和分栏的数据的文档? 分页时,页面上展示的是同一类型的列表的数据,如图: 分栏时,每行都是一个列表,而且展示的数据类型也可能不同 这也是两种常用的数据返回形式 说明:刘宏缔的 ...

  4. spring boot:用swagger3生成接口文档,支持全局通用参数(swagger 3.0.0 / spring boot 2.3.2)

    一,什么是swagger? 1,  Swagger 是一个规范和完整的文档框架, 用于生成.描述.调用和可视化 RESTful 风格的 Web 服务文档 官方网站: https://swagger.i ...

  5. Spring Boot使用MyBatis Generator、Swagger

    MyBatis是Java目前主流的ORM框架,在Spring Boot中使用MyBatis可以参考这篇文章:http://www.ityouknow.com/springboot/2016/11/06 ...

  6. 学记:为spring boot写一个自动配置

    spring boot遵循"约定优于配置"的原则,使用annotation对一些常规的配置项做默认配置,减少或不使用xml配置,让你的项目快速运行起来.spring boot的神奇 ...

  7. Spring Boot 部署与服务配置

    Spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动.其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat).当然你也可以将项 ...

  8. Spring Boot 探索系列 - 自动化配置篇

    26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging f ...

  9. Spring Boot Dubbo applications.properties 配置清单

    摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 与其纠结,不如行动学习.Innovate ,And out execute ! 』 本文 ...

随机推荐

  1. 微信小程序-组件-视图容器

    1.view 1.作用:类似 html 的 div 用来进行页面布局,具有块级盒子特性. 2.常用属性:设置view盒子点击后的状态,以及控制是否影响父盒子的点击状态 3.eg:<view ho ...

  2. App测试理论简介

    一.App测试常见关注点 1.App的功能测试 功能测试都是我们首要测试的,只有功能实现了才算符合上线发布的最低标准.我们需要检测产品功能是否已实现.产品功能是否符合设计要求.产品功能是否有重复.产品 ...

  3. swift基本体验

    Swift初体验 1. 导入框架 2. 定义标识符: let/var 3. 语句结束时;可以省略 4. print() 5. let/var 6. 逻辑分支 7. 循环使用 // 1.Swift中如何 ...

  4. Unit3:控件\布局

    控件 TextView <TextView android:layout_width="match_parent" android:layout_height="w ...

  5. [算法与数据结构]使用Java泛型实现栈

    ###题解 1 实现内部类node 2 维护top为头节点的链表 3 操作 操作1:push() 操作2: pop() 操作3: isEmpty() ###代码 package Exam; class ...

  6. maven-shade-plugin插件未生效原因分析

    今天在项目的pom文件中引入maven-shade-plugin插件,构建一个uber-jar(包含所有依赖的jar包),但是诡异的事情出现了,执行mvn package后生成的jar包竟然没有包含被 ...

  7. Redis哨兵模式(sentinel)部署

    1 主机环境 我这里使用的操作系统是centos 6.5,安装在vmware上,共三台. 主机名 IP 操作系统 用户名 安装目录 node1 192.168.1.101 centos 6.5 wxy ...

  8. JDK13环境变量配置

    第一步:下载JDK(开发工具包) JDK分为OracleJDK和OpenJDK下面简要说明 OracleJDK 部分代码闭源.商业收费 OpenJDK 开放源码.商业免费 两者大部分代码是共用的(除闭 ...

  9. 【Java并发编程】从CPU缓存模型到JMM来理解volatile关键字

    目录 并发编程三大特性 原子性 可见性 有序性 CPU缓存模型是什么 高速缓存为何出现? 缓存一致性问题 如何解决缓存不一致 JMM内存模型是什么 JMM的规定 Java对三大特性的保证 原子性 可见 ...

  10. 一文带你熟悉JAVA IO这个看似很高冷的菇凉

    Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 N ...