引言

本文代码已提交至Github(版本号:d439ec96b39dc0adf0d697cbc6bfc87c1c3b7dc8),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop

在上一篇博客《淘东电商项目(67) -互联网安全架构设计(方法论)》,主要讲解了互联网安全架构设计的方法,主要介绍了如下几种:

  1. 基于网关实现IP黑名单与名单拦截
  2. API接口实现Token授权认证
  3. 使用MD5实现API接口验证签名,防止抓包篡改数据
  4. 实现API接口安全加密传输(公钥和私钥互换机制)
  5. 基于Oauth2.0 实现API接口开放平台
  6. 接口参数使用网关实现防止XSS、SQL注入
  7. 定期工具实现代码健康扫描

本文开始讲解具体的代码实现。

本文目录结构:
l____引言
l____ 1.实现思路
l____ 2.代码实现
l________ 2.1 数据库代码
l________ 2.2 建造者模式
l________ 2.3 建造者模式使用
l____ 3.测试

1.实现思路


在上图,可以看到,外网访问时会经过我们的网关,如果我们需要对访问者做出安全措施,必须在网关上做处理,如:“ip黑名单处理”、“MD5加签处理”等。

在SpringCloud中,这些处理均在zuul网关过滤器中处理,伪代码如下:

public class GatewayFilter extends ZuulFilter {@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();HttpServletResponse response = ctx.getResponse();response.setContentType("UTF-8");// TODO 1.验证ip地址是否在黑名单里,如果是则拒绝访问// TODO 2.通过MD5验签,判断参数是否被篡改// TODO 3.其它......return null;}

可以看到上面的代码是一步一步去处理的,其实是可以优化这种写法的,本文用到“建造者模式”。

2.代码实现

2.1 数据库代码

先贴上黑名单表的sql:

CREATE TABLE `blacklist` (`ID` int(11) NOT NULL COMMENT '主键id',`IP_ADDRES` varchar(255) DEFAULT NULL COMMENT 'ip地址',`RESTRICTION_TYPE` varchar(255) DEFAULT NULL COMMENT '限制类型',`AVAILABILITY` varchar(255) DEFAULT NULL COMMENT '是否可用',`REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',`CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建人',`CREATED_TIME` datetime DEFAULT NULL COMMENT '创建时间',`UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新人',`UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间',PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.2 建造者模式

建造者模式之前我的博客有讲解过,有兴趣的童鞋可以参阅:

  • 《设计模式10 - 建造者模式【Builder Pattern】》
  • 《设计模式系列教程(07) - 建造者模式》

2.3 建造者模式使用

①定义接口:

/*** description: 网关行为建造者* create by: YangLinWei* create time: 2020/5/20 9:09 上午*/
public interface GatewayBuild {/*** 黑名单拦截*/Boolean blackBlock(RequestContext ctx, String ipAddres, HttpServletResponse response);/*** 参数验证*/Boolean toVerifyMap(RequestContext ctx, String ipAddres, HttpServletRequest request);}

②接口实现:

/*** description: 参数验证* create by: YangLinWei* create time: 2020/5/20 9:09 上午*/
@Slf4j
@Component
public class VerificationBuild implements GatewayBuild {@Autowiredprivate BlacklistMapper blacklistMapper;@Overridepublic Boolean blackBlock(RequestContext ctx, String ipAddres, HttpServletResponse response) {// 2.查询数据库黑名单Blacklist meiteBlacklist = blacklistMapper.findBlacklist(ipAddres);if (meiteBlacklist != null) {resultError(ctx, "ip:" + ipAddres + ",Insufficient access rights");return false;}log.info(">>>>>>ip:{},验证通过>>>>>>>", ipAddres);// 3.将ip地址传递到转发服务中response.addHeader("ipAddres", ipAddres);log.info(">>>>>>ip:{},验证通过>>>>>>>", ipAddres);return true;}@Overridepublic Boolean toVerifyMap(RequestContext ctx, String ipAddres, HttpServletRequest request) {// 4.外网传递参数验证Map<String, String> verifyMap = SignUtil.toVerifyMap(request.getParameterMap(), false);if (!SignUtil.verify(verifyMap)) {resultError(ctx, "ip:" + ipAddres + ",Sign fail");return false;}return true;}private void resultError(RequestContext ctx, String errorMsg) {ctx.setResponseStatusCode(401);ctx.setSendZuulResponse(false);ctx.setResponseBody(errorMsg);}
}

③定义组装类:

@Component
public class GatewayDirector {@Resource(name = "verificationBuild")private GatewayBuild gatewayBuild;public void direcot(RequestContext ctx, String ipAddres, HttpServletResponse response, HttpServletRequest request) {/*** 黑名单拦截*/Boolean blackBlock = gatewayBuild.blackBlock(ctx, ipAddres, response);if (!blackBlock) {return;}/*** 参数验证*/Boolean verifyMap = gatewayBuild.toVerifyMap(ctx, ipAddres, request);if (!verifyMap) {return;}}}

④过滤器里使用:

/*** description: 网关拦截* create by: YangLinWei* create time: 2020/5/20 9:10 上午*/
@Component
@Slf4j
public class GatewayFilter extends ZuulFilter {@Autowiredprivate GatewayDirector gatewayDirector;@Overridepublic Object run() throws ZuulException {RequestContext ctx = RequestContext.getCurrentContext();HttpServletRequest request = ctx.getRequest();HttpServletResponse response = ctx.getResponse();response.setContentType("UTF-8");// 1.获取ip地址String ipAddres = getIpAddr(request);if (StringUtils.isEmpty(ipAddres)) {resultError(ctx, "未能够获取到ip地址");}gatewayDirector.direcot(ctx, ipAddres, response, request);return null;}private void resultError(RequestContext ctx, String errorMsg) {ctx.setResponseStatusCode(401);ctx.setSendZuulResponse(false);ctx.setResponseBody(errorMsg);}@Overridepublic boolean shouldFilter() {return true;}@Overridepublic int filterOrder() {return 0;}/*** 在方法之前拦截* * @return*/@Overridepublic String filterType() {return "pre";}/*** 获取Ip地址* * @param request* @return*/public String getIpAddr(HttpServletRequest request) {String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("WL-Proxy-Client-IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_CLIENT_IP");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getHeader("HTTP_X_FORWARDED_FOR");}if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}return ip;}}

④application.yml配置过滤的地址:

###服务启动端口号
server:port: 80
###服务注册到eureka地址
eureka:client:service-url:defaultZone: http://localhost:8100/eureka
###服务名称(服务注册到eureka名称)
spring:application:name:  taodong-shop-basics-zuul###数据库相关连接datasource:username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/taodong-gateway?useUnicode=true&characterEncoding=utf8&useSSL=false
### 配置网关反向代理
zuul:routes:api-a:### 以 /api-weixin/访问转发到会员服务path: /api-weixin/**serviceId: taodong-shop-service-weixinapi-b:### 以 /api-member/访问转发到订单服务path: /api-member/**serviceId: taodong-shop-service-memberapi-c:### 以 /api-member/访问转发到订单服务path: /api-pay/**serviceId: taodong-shop-service-paytaodong-shop:zuul:swagger:document: '[ { "name": "taodong-shop-service-member", "location": "/taodong-shop-service-member/v2/api-docs","version": "2.0" }, { "name": "taodong-shop-service-weixin", "location":"/taodong-shop-service-weixin/v2/api-docs", "version": "2.0" } ]'
### mybatis 日志打印
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:level:com.ylw.basics.zuul.mapper: debug

3.测试

浏览器访问:
http://127.0.0.1/api-pay/cratePayToken?payAmount=8882&orderId=20200513141452&userId=27&productName=玉米香肠,可以看到被拦截了。

数据库黑名单,改为允许访问:

可以看到能正常访问:

本文完!

淘东电商项目(68) -互联网安全架构设计(黑名单拦截及MD5加签)相关推荐

  1. 淘东电商项目(79) -项目Github开源

    1. 项目介绍 Github地址:https://github.com/ylw-github/taodong-shop 众所周知,目前主流的电商企业就是 "淘宝" 和 " ...

  2. 淘东电商项目(20) -会员唯一登录

    引言 在上一节<淘东电商项目(19) -日志打印>,主要讲解「淘东项目」slf4j日志框架的基本使用方法. 本文代码已提交至Github(版本号:e2b2700c36fdaef263681 ...

  3. 淘东电商项目(27) -门户登出功能

    引言 本文代码已提交至Github(版本号:42c2ed4af58dac7388e399a1f3606baf4c57744e),有兴趣的同学可以下载来看看:https://github.com/ylw ...

  4. 淘东电商项目(47) -商品搜索服务功能的实现(集成拼音分词器)

    引言 本文代码已提交至Github,有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop 在上一篇博客<淘东电商项目(46) -商品搜 ...

  5. 淘东电商项目(14) -公众号获取注册码功能

    引言 在上一节<淘东电商项目(13) -项目整合WxJava>,主要讲解如何把WxJava框架整合到我们的电商项目,并完成了"鹦鹉学舌"的功能. 代码已提交至Githu ...

  6. 淘东电商项目(35) -SSO单点登录(登录功能完善)

    引言 本文代码已提交至Github(版本号:725238a1d0c829ee28cdef0ffe49e5f1c0020a2b),有兴趣的同学可以下载来看看:https://github.com/ylw ...

  7. 淘东电商项目(26) -门户登录功能

    引言 本文代码已提交至Github(版本号:8f3a993f0f9b92071437d16ed290e27ac1c64cde),有兴趣的同学可以下载来看看:https://github.com/ylw ...

  8. 2 大数据电商数仓项目——项目需求及架构设计

    2 大数据电商数仓项目--项目需求及架构设计 2.1 项目需求分析 用户行为数据采集平台搭建. 业务数据采集平台搭建. 数据仓库维度建模(核心):主要设计ODS.DWD.DWS.AWT.ADS等各个层 ...

  9. 大数据项目之电商数仓、数据仓库概念、项目需求及架构设计

    文章目录 1.数据仓库概念 2. 项目需求及架构设计 2.1 项目需求分析 2.1.1 采集平台 2.1.2 离线需求 2.1.3 实时需求 2.1.4 思考题 2.2 项目框架 2.2.1 技术选型 ...

最新文章

  1. python使用imbalanced-learn的NeighbourhoodCleaningRule方法进行下采样处理数据不平衡问题
  2. 一文概览深度学习中的五大正则化方法和七大优化策略
  3. 新瓶旧酒ASP.NET AJAX(6) - 客户端脚本编程
  4. .NET 5 程序高级调试-WinDbg
  5. html流式布局插件,Jquery瀑布流网格布局插件
  6. 面试时会谈薪的人一开口就赢了:让你薪资翻倍的谈薪技巧
  7. idea总结几个不错的插件
  8. 5G套餐月资费感受下:最低325元 仅提供8GB数据流量
  9. pb中建立人员信息表_根据部门名称,从Excel人员花名册表格中快速调取所有员工信息...
  10. oracle “**with as**”短语,也叫做子查询部分。
  11. ArcEngine 固定比例放大缩小
  12. python爬虫爬取网页图片_Python之多线程爬虫抓取网页图片
  13. 大屏可视化之适配和布局
  14. 基于STM32的物联网健康监测系统设计(附源码)
  15. markdown 目录一键生成和转为 word 格式
  16. 学习笔记25马氏链模型
  17. 北京清华长庚医院核酸检测流程
  18. iOS 关于ASIHTTPRequest
  19. 网站自动链接SEO优化技巧
  20. srs流媒体服务器推流的流程

热门文章

  1. Ubuntu下U盘只读文件系统,图标上锁,文件无法写入
  2. Android 安装的app
  3. ionic如何使用第三方iconfont,以及图标微调 (转载)
  4. FIT2CLOUD飞致云发布开源轻量级云管平台CloudExplorer Lite
  5. linux下iso文件的制做和解压
  6. js如何取到ajax回调函数值,js怎样获取调用回调函数的参数值
  7. python模块之signal信号
  8. Python Signal 信号
  9. 【无标题】JAVA解压ZIP文件并解析Excel(easyExcel)
  10. 腾讯员工收入曝光,我顿悟了一个成人世界的残酷事实