有很多文章提到,在生产环境中需要关闭Swagger功能,防止系统资源泄露。今天,我结合自己开发过程中的经验,分享一个只需几行代码便可实现让Apache Shiro接管Swagger认证和授权的方法。如果还有更好的方法,欢迎在文章末尾给我留言,一起交流。

初识Swagger

简单来说,Swagger是一个开放源代码的框架,旨在使用通用化的语言,让开发者和非开发者都能理解你设计的API是什么结构,有什么用途。API文档好比建筑蓝图,在建造房子时,必须按照蓝图的规格参数进行。

通常,一个软件项目会伴随着很多的API文档需要编写,当软件版本变更时,还需要修改所有的API文档细节(例如:请求地址,请求参数,返回值等等)。这是一件极具挑战性的工作。长期以来,工程师们一直在努力寻找一种标准化的流程/方法来解决API文档的设计,编写,测试和维护问题,Swagger就是在这样一种背景下诞生的。

Swagger为API文档的设计,开发,测试,维护提供了统一的解决方案。这极大的减轻了开发人员的工作负担。但随之而来的一个问题也会让人担心,通过Swagger UI提供统一的API文档阅览和测试,这会导致在生产环境下暴露系统资源。我们并不希望所有人都可以查阅系统的API文档,就像不是所有人都有权限查看建筑蓝图一样。那么如何解决这一问题呢?

Apache Shiro接管Swagger权限认证

Swagger官方提供了6种认证和授权方式:basic-authenticationAPI密钥bearer-authenticationOauth 2.0OpenID Connect DiscoveryCookie。但这几种方式在体验上效果都不好(当然,你也可以选择在生产环境中关闭Swagger的功能)。能不能有一种方式,让系统本身的权限认证体系接管Swagger的授权认证工作,让Swagger专注于自己擅长的领域呢?这就是本文要介绍的重点。

快速认识Apache Shiro

Apache Shiro™是一个功能强大且易于使用的Java安全框架,用于执行身份认证,授权,加密和会话管理。你可以轻松地将其集成到你的项目中,且不需要改动太多的代码。Shiro支持一个或多个可插拔的数据源,例如LDAP、JDBC、Active Directory等等,与此同时,Shiro还支持不同粒度的访问控制,如基于用户组,用户角色,资源权限等。

使用Shiro接管Swagger认证授权

首先,假定你已经在自己的项目中使用了Swagger,并且你的项目是基于Spring Boot 2.0进行构建的,同时使用Maven对项目的依赖进行管理。如果你的项目还未使用Swagger,请将下面代码配置到pom.xml文件中:

<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version>
</dependency>
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version>
</dependency>

另外,请检查项目中是否加入了Shiro项目依赖,如果还未添加,请将下面代码配置到pom.xml文件中:

<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.4.2</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-ehcache</artifactId><version>1.4.0</version>
</dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.4.0</version>
</dependency>

备注
shiro-core:Apache Shiro核心依赖包
shiro-ehcache:基于Ehcache实现的数据缓存依赖包
shiro-spring:Apache Shiro与Spring整合依赖包

配置Swagger

依赖就绪后,创建一个Swagger的配置文件并设置Swagger要扫描的包路径(通常是Controller所在的包),API文档标题(title),描述(description),版本号(version),联系方式(contact)以及证书名称(license)等等。下面是Swagger配置文件示例:

SwaggerConfiguration.java

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {@Beanpublic Docket createRestApi(){return new Docket(DocumentationType.SWAGGER_2).pathMapping("/").select().apis(RequestHandlerSelectors.basePackage("com.ramostear.controller")).paths(PathSelectors.any()).build().apiInfo(new ApiInfoBuilder().title("Apache Shiro & Swagger").description("使用Apache Shiro接管Swagger认证和授权").version("1.0.0").contact(new Contact("树下魅狐","https://www.ramostear.com","ramostear@163.com")).license("The Apache License").build());}
}

注意
除了使用@Configuration对配置类进行注解外,别将@EnableSwagger注解遗漏!

在Shiro中配置Swagger

如果你的项目已经使用Apache Shiro进行认证和授权工作,那么只需要在ShiroFilterFactoryBean的配置代码中加入对Swagger的过滤操作即可。你可以参照下面的代码进行配置:

ShiroConfiguration.java

@Configuration
public class ShiroConfiguration{@Beanpublic EhCacheManager ehCacheManager(){...}@Beanpublic CustomShiroRealm customShiroRealm(){...}@Beanpublic SecurityManager securityManager(){DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setCacheManager(ehCacheManager());securityManager.setRealm(customShiroRealm());return securityManager;}...@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();filterFactoryBean.setSecurityManager(securityManager);Map<String,String> filterChainDefinition = new LinkedHashMap<>();...filterChainDefinition.put("/swagger-ui.html","authc");filterChainDefinition.put("/v2/**","authc");filterChainDefinition.put("/swagger-resources/**","authc");filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinition);return filterFactoryBean;     }....
}

补充
除了上述给出的配置方式外,你可以根据实际需要,配置更细粒度的权限,例如用户组,角色以及资源权限等等。

至此,如果你的项目原本使用了Apache Shiro框架,那么只需在原代码的基础上,增加三行配置代码,即可让Apache Shiro接管Swagger的认证和授权工作。

最后,通过实际项目来演示Apache Shiro接管Swagger认证和授权工作的效果:

说明
/admin/swagger请求页面嵌入了一个iframe,其地址为:/swagger-ui.html。具体代码如下:swagger.html
<html> <head> ... </head> <body> ... <iframe src="./swagger-ui.html" frameborder="0" scrolling="auto"></iframe> ... </body> </html>

当用户登录成功后,可以正常访问Swagger的API文档页面,当注销当前用户后,再次访问Swagger页面,系统会跳转到用户登录页面,要求验证用户身份。

未经允许,请勿转载

iframe 返回上一页_Swagger权限认证上:基于Apache Shiro相关推荐

  1. 小程序获取上一页的数据修改上一个页面的数据

    小程序获取上一页的数据修改上一个页面的数据 详情地址http://www.xiaoshu168.com/wxapplet/233.html

  2. vue返回上一页并传值回上一个页面(uni版本)

    1.返回上一页点击按钮及配置参数 backNav() {uni.$emit("planAdd",{tabIndex: 2});uni.navigateBack(); //此地方用的 ...

  3. vue返回上一页,如果没有上一页返回首页

    methods: { back(){ if (window.history.length <= 1) { this.KaTeX parse error: Expected 'EOF', got ...

  4. 自定义导航栏,返回上一页,如果没有上一页返回首页

    back(){if (getCurrentPages().length > 1) {uni.navigateBack()} else {uni.redirectTo({url: '/pages/ ...

  5. vue 如何点击按钮返回上一页

    1,vue 如何点击按钮返回上一页呢? 这是vue挂载的范围html代码 <div @click="goOff()">返回</div> 下面是点击返回的方法 ...

  6. Uniapp返回上一页触发页面更新

    文章目录 前言 一.难点有哪些? 二.返回上一页 三.触发上一页的更新 四.监听reFresh 五.示例源码 总结 前言 本来返回上一页可以使用uni.navigateBack(OBJECT),但是这 ...

  7. uniapp无法返回上一页_uni-app 返回上一页或返回多页后刷新页面

    我们在用 uni-app 开发前端时,有时在返回上一页后要刷新上一页的数据,如登录后返回上一页刷新登录状态.我们可以通过 uni.navigateBack 的成功回调函数来实现.具体实现方式如下: 要 ...

  8. 解决VUE返回上一页,上一页空白问题

    问题: 我做项目的时候 发现vue返回上一页的时候, 有时候router不会读取router上的参数,就会导致我的项目空白. 思路: 让返回上一页的时候,上一页能读取到路由参数 解决: 根据上下页的n ...

  9. SpringBoot集成权限认证框架(Sa-Token)

    SpringBoot集成权限认证框架(Sa-Token) 介绍 身份验证又称"验证"."鉴权",是指通过一定的手段,完成对用户身份的确认. 身份验证的目的是确认 ...

  10. springboot整合shiro + jwt + redis实现权限认证(上手即用)

    目录 前言 项目结构 依赖导入 建数据库表 建表语句 使用插件生成增删改查 添加MyRealm 添加ShiroConfig 添加JwtFilter JWT相关得类 JwtToken JwtAudien ...

最新文章

  1. 第3章—高级装配—条件化的Bean
  2. 代码坏味道 - 耦合
  3. 码农在墨尔本首次求职有感
  4. linux下提示/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14‘ not found 解决办法
  5. 自动将存储过程转成C#代码的过程[转]
  6. 学python有什么用-为什么要学Python?学了有什么用?
  7. 使用jprobe建设镜面层叠的原则和见解
  8. Ubuntu14.10安装Eclipse
  9. 著名线性代数教授 85岁麻省理工学院教授,给2020本科生教授《线性代数入门》
  10. 交叉火力dsp手机调音软件_万能dsp调音软件
  11. VB.NET读取数据库时多线程显示进度条
  12. 基于用户的协同过滤Movielens电影推荐系统简单实例
  13. taxi计费器c语言程序,基于单片机的出租车计费器的设计(附实物图,原理图,程序)...
  14. woc,又一个大佬辞职了……
  15. 基于视觉导航的自主机器人简介(一)
  16. vue computed 与mounted 区别
  17. Hive启动报错:java.lang.ClassNotFoundException: org.apache.tez.dag.api.TezConfiguration
  18. 提问的艺术!(转载)
  19. Unity3D占用内存太大怎么解决呢? -中
  20. 生信分析流程框架概述

热门文章

  1. TableViewCell 自定义分割线
  2. Freebsd-9.0 how to change default sound device
  3. PHP正则表达式入门教程
  4. 偶然翻开旧日记本,发现了好多的情诗!!!!
  5. 服务器配置ssh 登录,取消账号密码登录
  6. finally语句与return语句相关问题
  7. springboot整合rabbitmq之消息的确认机制
  8. Activities 四大组件之一
  9. Java语言中的----继承(二)
  10. JSON stringify and parse