码迷,mamicode.com
首页 > 编程语言 > 详细

Spring cloud微服务安全实战-3-9API安全机制之审计日志_batch

时间:2019-11-21 16:56:39      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:异常处理   服务器错误   配置   figure   class   let   mamicode   区分   定义   

首先说一下审计日志的处理。审计日志处理的位置,应该是在认证之后,授权之前。因为只有你在认证之后,你才能知道这个请求到底是谁发出来的,谁在做这个事情。在这个授权之前,这样的话那些被拒绝掉的请求。在响应的时候你才可以把他记下来。 
技术图片
日志一定要持久化,可以把它存到数据库里,也可以把它写到文件里。

怎么保证过滤器按照顺序执行的,我们在做流控和认证的过滤器的时候,实际上,并没有指定的顺序。那么现在到底是流控先执行 还是认证先执行?
技术图片
在流控的Filter先打印一个1
技术图片

在认证的Filter里面 我们再打一个2
技术图片

发送请求 发现先输出了2  后输出了1。说明先走的认证 再走的流控
技术图片

调整Filter的执行顺序

技术图片

认证在第二个 就写个@Order(2)
技术图片
重启服务进行测试
技术图片

审计日志-简单实现

审计日志不能用filter来做了。因为审计日志我们要做两个动作。第一个是在请求进来后,我们要做一个动作。然后在请求出去之后,要把这个日志更新一下,所以进和出都要做事。如果只在请求进来记录 实际上不知道最终这个请求最终是成功了还是失败了。这样这个日志记录不完整。
如果用Filter来做,它只有一个doFilterInternal这么个方法,它是标准的Filter方法的实现,并没有明确的区分在请求进来执行还是请求出去的时候执行。
技术图片

我们使用SpringBoot提供的Interceptor。
ControllerAdvice一般是用来做全局的异常处理。
技术图片

新建审计日志类

AuditLog
技术图片

技术图片

加上@CreateDate和@LastModifiedDate这两个注解,我们在使用Repository的save方法的时候,它会自动判断你是创建还是修改并给这两个日期赋值。
技术图片
技术图片

审计日志Repository


技术图片

技术图片

创建Interceptor


技术图片

继承的是,HandlerInterceptorAdpater 处理之前和处理之后,主要是要实现这两个方法。
技术图片

技术图片
声明称一个组件,使用@Component
技术图片
最终返回true、返回false 的请求就不会被执行。
技术图片
因为下面要用,所以这里,设置id。
技术图片
afterCompletion 不管成功还是失败,都会去调用
技术图片

让拦截器作用,还需做一些配置

技术图片

要实现接口WebMvcConfigurer
技术图片
注入auditLogInterceptor,然后加入到Spring里面。 拦截去是根据添加的来执行的 先add的就先执行。
技术图片
还可以指定拦截器,只针对某些请求有效。这里我们不配置的话就是针对所有的请求,都走这个拦截器。
技术图片
JPA有一个自动支持审计的功能
技术图片
这个是个总开关,把JPA的审计打开。
技术图片
然后在需要做审计的类上面加上注解@EntityListeners(AuditingEntityListener.class) 把兼容器注入进来。
技术图片

运行测试

输出的日志里面,输出了创建表的语句
技术图片

访问一个id为13的 再访问id为12的。
技术图片

创建时间和修改时间 都是JPA自动帮我们填上的
技术图片
错误的请求,先保存一个200的记录,又保存了一个500的记录。这是Spring默认的一个处理机制。有了异常后跳到一个error的路径上。错误的页面的状态码是500.这个跳转 实际上是不利于我们分析问题的
技术图片

处理配置

创建一个ErrorHandler
技术图片
这里我们用到了 Controller的增强。Advice。 由这里来接管我们的错误处理,不再走Spring默认的处理、
技术图片

一旦报错就把状态改成500内部服务器错误。
技术图片
把错误信息和当前时间 返回回去。这样我就有了一个公共的异常处理类。
技术图片

再次运行程序测试。

技术图片
这次的信息。,是time和message。这是我们自己在异常类里面定义的两个字段、。
技术图片

这次把请求错误记录了下来 并且一条记录。
技术图片

审计-username

审计的时候记录当前用户是谁。
创建人
技术图片
最后修改人
技术图片
单写一个注解是不够的,还需要一个Bean来帮它知道当前的用户是谁。
用@Bean注解,然后返回一个AuditorAware的泛型 里面是String类型。然后里面写一个匿名的实现。
技术图片
这样就拿到了一个AuditorAware。 日常开发中是把用户信息存储在Redis中的。这里为了简单的实现。
这里方法会告诉JPA当前的用户是谁。用户是谁具体的逻辑要自己去实现。这里只是简单的写死了是jojo
技术图片

然后过滤器的这段。拿到用户的请求这段代码就不再需要了。
技术图片
直接save就可以了
技术图片
save的时候看到类上有@CreateBy的注解
技术图片
就会调用这个Bean类的getCurrentAuditor方法,。然后拿到返回来的String。把它设置到username上。
技术图片

运行测试

技术图片
username就是写死的值。
技术图片
以上就是JPA对审计的支持,。

 

结束

Spring cloud微服务安全实战-3-9API安全机制之审计日志_batch

标签:异常处理   服务器错误   配置   figure   class   let   mamicode   区分   定义   

原文地址:https://www.cnblogs.com/wangjunwei/p/11906449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!