Spring Cloud微服务安全实战_3-6_API安全机制之审计
审计日志
定义:谁,在什么时间,干了什么事。
位置:认证之后,授权之前。
这样就知道是谁在访问,拒绝掉的访问也能被记录。如果放在认证之前,那么就不知道是谁在访问;如果放在授权之后,就没办法记录被拒绝的访问。
存储:审计日志一定要持久化,记在数据库里或者是文件,放在内存会丢失。(输出到公司的日志服务)
怎么记:请求进来的时候记录一次,请求出去的时候,更新日志。
如果只在请求进来的时候记,那么请求的成功与否是不知道的。如果只在请求返回的时候记,那么如果一个请求把你的系统搞挂了,也没有记,是不知道谁搞挂的。
技术选择:过滤器 VS 拦截器 VS ControllerAdvice VS AOP
过滤器,不好分辨是请求过来执行的还是请求出去执行的; ControllerAdvice-做全局异常处理 ;AOP -不说了
就用拦截器,拦截器在过滤器之后执行。
限流过滤器用 @Order注解,控制在第一个执行
认证过滤器,排在老二位置:
再写个审计拦截器,就是过滤器之后执行了
实现
数据库
实体类:
/**
* <p>
* 审计日志
* </p>
*
* @author 李浩洋
* @since 2019-10-27
*/
@Data
public class AuditLog implements Serializable { private static final long serialVersionUID = 1L; private Long id; /**
* http方法
*/
private String method; /**
* 请求路径
*/
private String path; /**
* http状态码
*/
private Integer status; /**
* 请求用户名
*/
private String username; /**
* 创建时间
*/
private Date createTime; /**
* 修改时间
*/
private Date updateTime; }
审计拦截器:
package com.nb.security.interceptor; import com.nb.security.entity.AuditLog;
import com.nb.security.entity.User;
import com.nb.security.service.IAuditLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date; /**
* 审计日志拦截器
* 拦截流程
* 流控 -- 认证 --审计 -- 授权 -- 业务
* 审计要在进入接口之前,insert 数据库(实际可能发送到专门的日志服务器),执行完后 update,过滤器不便于判断拦截之前、之后,故用拦截器
*/
@Component
public class AuditLogInterceptor extends HandlerInterceptorAdapter { @Autowired
private IAuditLogService auditLogService; @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { AuditLog log = new AuditLog();
log.setMethod(request.getMethod());
log.setPath(request.getRequestURI());
log.setCreateTime(new Date()); User user = (User) request.getAttribute("user");
if (user != null) {
user.setUsername(user.getUsername());
}
auditLogService.save(log); //将审计日志的id传给request,以便于请求处理完成后更新审计日志
request.setAttribute("auditLogId", log.getId()); return super.preHandle(request, response, handler);
} /**
* 请求处理成功失败,都更新审计日志
*
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
//审计日志id
Long auditLogId = (Long) request.getAttribute("auditLogId");
AuditLog log = auditLogService.getById(auditLogId);
log.setStatus(response.getStatus());
log.setUpdateTime(new Date());
auditLogService.updateById(log); super.afterCompletion(request, response, handler, ex);
}
}
拦截器配置:
@Configuration
public class SecurityConfig implements WebMvcConfigurer { //审计日志
@Autowired
private AuditLogInterceptor auditLogInterceptor; @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(auditLogInterceptor);//.addPathPatterns();//先add的先执行,默认所有请求都拦截
}
}
用Postman来一个正确的请求:
数据库新增了一条数据
控制台可以看到执行顺序,就是想要的结果。
错误的访问:
数据库insert了两条数据,一个是我的请求 /users/12 ,另一个 /error 是SpringBoot抛出异常后,会跳到一个/error 的路径,
新建一个异常处理器:
再发一个失败的请求:
数据库就不会再有 /error 请求了。
代码:https://github.com/lhy1234/springcloud-security/tree/master/nb-user-api
+++++++++++++++++++++分割线++++++++++++++++++++++++++++++
小结
本篇说了什么是审计,审计在代码中的位置,以及用拦截器来实现审计
Spring Cloud微服务安全实战_3-6_API安全机制之审计的更多相关文章
- Spring cloud微服务安全实战-3-4 API安全机制之认证(1)
本节开始讲认证相关的东西.注意事项,出现问题的对应的解决方案. 先写用户注册的服务,注册一些用户信息进去.注册也是我们安全体系的一部分 注册 UserController里面的create方法 先修改 ...
- Spring cloud微服务安全实战-3-3 API安全机制之流控
首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...
- Spring cloud微服务安全实战-3-5 API安全机制之认证(2)
基于Http协议的认证方式有很多.本节我们只讲一个最简单的HttpBasic认证.聪明就可以看出来,这是一个最基础的认证,好处是简单方便,所有的主流浏览器都支持,问题就是并不是非常安全的,但是帮我们大 ...
- Spring cloud微服务安全实战_汇总
Spring cloud微服务安全实战 https://coding.imooc.com/class/chapter/379.html#Anchor Spring Cloud微服务安全实战-1-1 课 ...
- 《Spring Cloud微服务 入门 实战与进阶》
很少在周末发文,还是由于昨晚刚收到实体书,还是耐不住性子马上发文了. 一年前,耗时半年多的时间,写出了我的第一本书<Spring Cloud微服务-全栈技术与案例解析>. 时至今日,一年的 ...
- Spring Cloud微服务安全实战_00_前言
一.前言: 一直以来对服务安全都很感兴趣,所以就学习.这是学习immoc的 jojo老师的 <Spring Cloud微服务安全实战课程>的笔记,讲的很好. 课程简介: 二.最终形成的架 ...
- Spring Cloud微服务安全实战_4-5_搭建OAuth2资源服务器
上一篇搭建了一个OAuth2认证服务器,可以生成token,这篇来改造下之前的订单微服务,使其能够认这个token令牌. 本篇针对订单服务要做三件事: 1,要让他知道自己是资源服务器,他知道这件事后, ...
- Spring Cloud微服务安全实战_4-3_订单微服务&价格微服务
实现一个场景: 订单微服务: POM: <?xml version="1.0" encoding="UTF-8"?> <project xml ...
- Spring cloud微服务安全实战 最新完整教程
课程资料获取链接:点击这里 采用流行的微服务架构开发,应用程序访问安全将会面临更多更复杂的挑战,尤其是开发者最关心的三大问题:认证授权.可用性.可视化.本课程从简单的API安全入手,过渡到复杂的微服务 ...
- Spring cloud微服务安全实战-6-8sentinel限流实战
阿里2018年开源的. 简单来说就是干三件事,最终的结果就是保证你的服务可用,不会崩掉.保证服务高可用. 流控 先从最简单的场景来入手. 1.引用一个依赖, 2,声明一个资源. 3.声明一个规则 注意 ...
随机推荐
- Paper | Dynamic Residual Dense Network for Image Denoising
目录 1. 故事 2. 动机 3. 做法 3.1 DRDB 3.2 训练方法 4. 实验 发表于2019 Sensors.这篇文章的思想可能来源于2018 ECCV的SkipNet[11]. 没开源, ...
- Office Online Server 在线编辑Office文档,安装部署
Office Online Server部署安装 部署环境 一台windows server2012 (搭建域环境)/多次遇坑之后,强烈建议域环境为server2012 一台windows serve ...
- 基于Django的Rest Framework框架的频率组件
0|1一.频率组件的作用 在我们平常浏览网站的时候会发现,一个功能你点击很多次后,系统会让你休息会在点击,这其实就是频率控制,主要作用是限制你在一定时间内提交请求的次数,减少服务器的压力. modle ...
- [开源]OSharpNS 步步为营系列 - 1. 业务模块设计
什么是OSharp OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架.这个 ...
- Windows Azure Virtual Machine (39) 清除Linux挖矿病毒
<Windows Azure Platform 系列文章目录> 1.之前客户遇到了Azure Linux CPU 100%,症状如下: 2.SSH登录到Linux,查看crontab,有从 ...
- LeetCode 209:最小长度的子数组 Minimum Size Subarray Sum
公众号: 爱写bug(ID:icodebugs) 作者:爱写bug 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子 ...
- app版本升级的测试点
移动端版本更新升级是一个比较重要的功能点,主要分为强制更新和非强制更新. 1.强制更新需要测试的点有: 1)强制升级是否可以升级成功 从老版本的包升级到新版版的包是否可以升级成功. 2)升级后的数据是 ...
- NoNodeAvailableException[None of the configured nodes are available:[.127.0.0.1}{127.0.0.1:9300]
我在springboot 集成 elasticsearch,启动springboot测试创建索引,建立索引的时候报 : NoNodeAvailableException[None of the con ...
- Python Jupyter 网站编辑器
Python Jupyter 网站编辑器 jupyter 是 python的网站编辑器可以直接在网页内编写python代码并执行,内置是通过ipython来调用的.很方便灵活. 安装 1.安装ipyt ...
- 使用NumPy、Numba的简单使用(二)
本来要写NLP第三课动态规划的,日了,写到一半发现自己也不会了,理论很简单,动态规划咋回事也知道,但是实现在源码上还是有点难度,现在简单给予题目描述,小伙伴也可以来思考一下,例题一,我们现在有1元硬币 ...