基于SpringBoot的WEB API项目的安全设计
SpringBoot的开箱即用功能,大大降低了上手一个WEB应用的门槛,友好的REST接口支持,在SpringCloud微服务体系中可编程性大大提高,本篇基于一个面向企业调用方用户的WEB API项目,基于SpringBoot来构建,简单看下接口的安全性模块设计。
主要借助于基于AOP技术来进行接口的安全防护,在SpringBoot下直接引入spring-boot-starter-aop即可使用。
1、在Pom中引入AOP配置
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
2、编写对应处理类即可,通过@Order(n)设置合法的校验顺序。如LogAspect
@Aspect@Order(1)@Componentpublic class LogAspect {private Logger logger=Logger.getLogger(LogAspect.class);@Pointcut("execution(public * com.wey.say.api.*.* (..))")public void apiLogAspect() {}@Before("apiLogAspect()")public void dobefore(JoinPoint joinPoint) {RequestAttributes ra = RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra = (ServletRequestAttributes) ra;HttpServletRequest request = sra.getRequest();// 使用log4j的MDC及NDC特性,识别请求方的IP及调用资料,输出到日志中MDC.put("uri", request.getRequestURI());NDC.push(request.getRemoteAddr());// 记录下请求内容logger.info("HTTP_METHOD : " + request.getMethod());logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."+ joinPoint.getSignature().getName());logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));NDC.pop();NDC.remove();MDC.get("uri");MDC.remove("uri");}@AfterReturning(returning = "ret", pointcut = "apiLogAspect()")public void doAfterReturning(Object ret) throws Throwable {// 处理完请求,返回内容logger.info("RESPONSE : " + ret);}
下面进入此系统关键的安全设计模块,由于是面向企业级接口调用用户,与面向大众的接口稍微有些不同,分为以下几个方面。
1、详细日志记录,凡请求过来均进行记录,便于后期识别非法请求的防范依据
参考上文中实现方式,可以再细化。进行日志的收集分析,后期分析接口的调用频率等进一步需求。
2、白名单限制,仅接受特定系统的请求响应,调用方的IP地址需要在本系统中报备,否则无法调用。
不采用黑名单机制,主要原因在于未知的IP量太大,只能采用允可的方式,成本最小,效果也最好。
3、调用法身份合法性验证,即便是白名单用户,也需要进行验证,确保用户真正合法。主要验证此请求是否确实来自于某一调用法,而非伪造的用户请求。
常见做法:为调用方设置一个唯一标识和一个密钥,接口到请求时校验这两者的合法性。
4、基于HmacSHA1算法进行请求参数完整性验证,主要用于检测传输过程中参数是否被篡改。
也可以采用的简单的MD5验签,效率更高。
5、防重放攻击,即可通过了前4个步骤,不排除利用合法请求,暴力调用的情况。在验证过程中增加时间戳项目,校验调用时间是否在允许范围内,比如1分钟之内。(案例:QQ第三方登陆在校验调用时间与服务时间时,时间差合理范围内,即便不一致,也可以使用)
CSRF的问题必须要重视,可以进行很强大的重放攻击。当然还有其它的如DOS攻击等。
6、流量控制。比较熟知的例子就是微信开放平台暴露的接口,DOC中明显指出某一接口一天内允许调用的次数,超过限制将无法响应。考虑到实际企业调用的情况,我们同样可以针对某一调用方某一请求进行限制
可借助Guava中对应RateLimiter模块功能,也可借助Redis高效响应机制自己设计,以调用方id+接口名称为KEY,设置接口调用上限即可,按天实时更新数据增量。
以上基本上可以算是个完整的安全防范过程,当然还是需要借助运维手段,在外层进行安全防范,比如WAF等,也可以在更高级处进行防范,比如网关接入层。
扩展阅读:
歪脖贰点零关注程序员个人成长
基于SpringBoot的WEB API项目的安全设计的更多相关文章
- 基于SpringBoot的Web API快速开发基础框架
其实还是很因为懒,才会有这个案例项目的产生,每次开启一个终端的小服务都要整理一次框架,造成重复的.不必要的.缺乏创造性的劳动,SO,本着可以用.用着简单的原则上传代码到Github,希望有需要的朋友直 ...
- 基于springboot的web项目最佳实践
springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单. 要做到简单,易用,扩展 ...
- 使用IDEA新建基于SpringBoot的Web项目(超详细)
目前java的开发很多Learner都慢慢的学习使用IDEA这款工具,个人觉得其实相比Eclipse来说差不多,个人习惯的问题,但是我还是推荐IDEA这款工具.虽然它目前是收费的,但相信网上的各种破解 ...
- Web API项目中使用Area对业务进行分类管理
在之前开发的很多Web API项目中,为了方便以及快速开发,往往把整个Web API的控制器放在基目录的Controllers目录中,但随着业务越来越复杂,这样Controllers目录中的文件就增加 ...
- 基于Attribute的Web API路由设置
路由对于MVC应用程序来说都是至关重要的一个部门,不管是asp.net mvc或者Ruby on Rails(当然还有其它的,我只熟悉这两个:) ) asp.net mvc自带的路由配置是在Glob ...
- 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD)
一些小的C/S项目(winform.WPF等),因需要访问操作数据库,但又不能把DB连接配置在客户端上,原因有很多,可能是DB连接无法直接访问,或客户端不想安装各种DB访问组件,或DB连接不想暴露在客 ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(3)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- 对一个前端使用AngularJS后端使用ASP.NET Web API项目的理解(2)
chsakell分享了一个前端使用AngularJS,后端使用ASP.NET Web API的项目. 源码: https://github.com/chsakell/spa-webapi-angula ...
- Web API(三):创建Web API项目
在本篇文章中将讲解如何使用Visual Studio创建一个新的ASP.NET Web API项目. 在Visual Studio中有两种方式用于创建Web API项目: 1.创建带MVC的Web A ...
随机推荐
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶(转)
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- 图像滤镜艺术---流行艺术风滤镜特效PS实现
原文:图像滤镜艺术---流行艺术风滤镜特效PS实现 今天,本人给大家介绍一款新滤镜:流行艺术风效果,先看下效果吧! 原图 流行艺术风效果图 上面的这款滤镜效果是不是很赞,呵呵,按照本人以往的逻辑,我会 ...
- Unpaired/Partially/Unsupervised Image Captioning
这篇涉及到以下三篇论文: Unpaired Image Captioning by Language Pivoting (ECCV 2018) Show, Tell and Discriminate: ...
- C# 金额转为大写金额
/// <summary> /// 金额转为大写金额 /// </summary> public class MoneyConvertChinese { /// <sum ...
- 零元学Expression Blend 4 - Chapter 2 入门界面简介
原文:零元学Expression Blend 4 - Chapter 2 入门界面简介 在这篇教学我将会介绍Expression Blend 4的基本界面,虽然有些网站已经有做了介绍,为了整个教学的完 ...
- ef 查询总结
1.Linq 查询两张表:a表和b表,要得到的数据是a表数据b表没有 例如:a表有5条数据1,2,3,4,5:b表有2条数据1,3:那么就用dataGridView1输出2,4,5:link语句要怎么 ...
- CS224n笔记二:word2vec
如何表示词语的意思 语言学中meaning近似于"指代,代指,符号". 计算机中如何处理词语的意思 过去一直采用分类词典,计算语言学中常见的方式时WordNet那样的词库,比如NL ...
- QTableWidget和 QTableView翻页效果(准确计算Scroll,然后使用setSliderPosition函数)
以QTableView举例,QTableWidget使用相同 int CQTTableViewPageSwitch::pageCount(QTableView *p)//QTableView 总页 ...
- 关于跨进程使用回调函数的研究:以跨进程获取Richedit中RTF流为例(在Delphi 初始化每一个TWinControl 对象时,将会在窗体 的属性(PropData)中加入一些标志,DLL的HInstance的值与HOST 进程的HInstance并不一致)
建议先参考我上次写的博文跨进程获取Richedit中Text: 获得QQ聊天输入框中的内容 拿到这个问题,我习惯性地会从VCL内核开始分析.找到TRichEdit声明的单元,分析TRichEdit保存 ...
- Windows10中的IIS10安装php manager
Windows10中自带的IIS:Microsoft-IIS/10.0. 然后这个10却让原本支持组件无法安装了,php manager组件安装时提示“必须安装IIS7以上才可以安装”. 那是不是真的 ...