基于SpringBoot的WEB API项目的安全设计

SpringBoot的开箱即用功能,大大降低了上手一个WEB应用的门槛,友好的REST接口支持,在SpringCloud微服务体系中可编程性大大提高,本篇基于一个面向企业调用方用户的WEB API项目,基于SpringBoot来构建,简单看下接口的安全性模块设计。

主要借助于基于AOP技术来进行接口的安全防护,在SpringBoot下直接引入spring-boot-starter-aop即可使用。

1、在Pom中引入AOP配置

 
  1. <dependency>  

  2.     <groupId>org.springframework.boot</groupId>  

  3.     <artifactId>spring-boot-starter-aop</artifactId>  

  4. </dependency>

2、编写对应处理类即可,通过@Order(n)设置合法的校验顺序。如LogAspect

 
  1. @Aspect

  2. @Order(1)

  3. @Component

  4. public class LogAspect {

  5.  

  6.    private Logger logger=Logger.getLogger(LogAspect.class);

  7.  

  8.    @Pointcut("execution(public * com.wey.say.api.*.* (..))")

  9.    public void apiLogAspect() {

  10.  

  11.    }

  12.  

  13.    @Before("apiLogAspect()")

  14.    public void dobefore(JoinPoint joinPoint) {

  15.        RequestAttributes ra = RequestContextHolder.getRequestAttributes();

  16.        ServletRequestAttributes sra = (ServletRequestAttributes) ra;

  17.        HttpServletRequest request = sra.getRequest();

  18.        // 使用log4j的MDC及NDC特性,识别请求方的IP及调用资料,输出到日志中

  19.        MDC.put("uri", request.getRequestURI());

  20.        NDC.push(request.getRemoteAddr());

  21.        // 记录下请求内容

  22.        logger.info("HTTP_METHOD : " + request.getMethod());

  23.        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "."

  24.                + joinPoint.getSignature().getName());

  25.        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));

  26.        NDC.pop();

  27.        NDC.remove();

  28.        MDC.get("uri");

  29.        MDC.remove("uri");

  30.    }

  31.  

  32.    @AfterReturning(returning = "ret", pointcut = "apiLogAspect()")

  33.    public void doAfterReturning(Object ret) throws Throwable {

  34.        // 处理完请求,返回内容

  35.        logger.info("RESPONSE : " + ret);

  36.    }

下面进入此系统关键的安全设计模块,由于是面向企业级接口调用用户,与面向大众的接口稍微有些不同,分为以下几个方面。

  • 1、详细日志记录,凡请求过来均进行记录,便于后期识别非法请求的防范依据

参考上文中实现方式,可以再细化。进行日志的收集分析,后期分析接口的调用频率等进一步需求。

  • 2、白名单限制,仅接受特定系统的请求响应,调用方的IP地址需要在本系统中报备,否则无法调用。

不采用黑名单机制,主要原因在于未知的IP量太大,只能采用允可的方式,成本最小,效果也最好。

  • 3、调用法身份合法性验证,即便是白名单用户,也需要进行验证,确保用户真正合法。主要验证此请求是否确实来自于某一调用法,而非伪造的用户请求。

常见做法:为调用方设置一个唯一标识和一个密钥,接口到请求时校验这两者的合法性。

  • 4、基于HmacSHA1算法进行请求参数完整性验证,主要用于检测传输过程中参数是否被篡改。

也可以采用的简单的MD5验签,效率更高。

  • 5、防重放攻击,即可通过了前4个步骤,不排除利用合法请求,暴力调用的情况。在验证过程中增加时间戳项目,校验调用时间是否在允许范围内,比如1分钟之内。(案例:QQ第三方登陆在校验调用时间与服务时间时,时间差合理范围内,即便不一致,也可以使用)

CSRF的问题必须要重视,可以进行很强大的重放攻击。当然还有其它的如DOS攻击等。

  • 6、流量控制。比较熟知的例子就是微信开放平台暴露的接口,DOC中明显指出某一接口一天内允许调用的次数,超过限制将无法响应。考虑到实际企业调用的情况,我们同样可以针对某一调用方某一请求进行限制

可借助Guava中对应RateLimiter模块功能,也可借助Redis高效响应机制自己设计,以调用方id+接口名称为KEY,设置接口调用上限即可,按天实时更新数据增量。

以上基本上可以算是个完整的安全防范过程,当然还是需要借助运维手段,在外层进行安全防范,比如WAF等,也可以在更高级处进行防范,比如网关接入层。

扩展阅读:

欢迎加入我的星球

 
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
资源介绍 本资源是一个基于Spring Boot开发Web智慧养老平台的毕业设计项目,包含完整的源代码和详尽的说明文档。该项目旨在通过现代互联网技术,为老年人提供更加便捷、智能的养老服务,提升他们的生活质量。 在技术实现上,本项目充分利用了Spring Boot框架的优势,实现了快速、高效的应用开发。通过Spring Boot的自动化配置和简化部署特性,项目搭建变得简单而高效。同时,项目还采用了前后端分离的开发模式,前端使用HTML、CSS和JavaScript进行页面展示和交互,后端则提供RESTful API接口供前端调用,保证了系统的灵活性和可扩展性。 在功能设计上,本项目涵盖了智慧养老平台的核心需求,包括老年人信息管理、健康监测、日常照护、社交互动等多个模块。通过老年人信息管理模块,可以方便地记录和管理老年人的基本信息和健康状况;健康监测模块则能够实时监测老年人的身体数据,及时发现异常情况并采取相应的措施;日常照护模块提供了智能化的照护服务,帮助老年人更好地生活;社交互动模块则让老年人能够与其他用户进行交流和互动,缓解孤独感。 此外,本项目还具有良好的可定制性和二次开发性。开发者可以根据实际需求对项目进行定制和扩展,添加更多的功能模块或优化现有功能。同时,项目还提供了详尽的说明文档,帮助开发者更好地理解项目结构和实现原理,降低开发难度。 总的来说,本资源是一个功能完善、技术先进、易于定制和二次开发的智慧养老平台毕业设计项目,对于学习Spring Boot开发和智慧养老领域知识的学生来说具有很高的参考价值和实践意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MavenTalk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值