HZERO-审计

作者邮箱时间
潘顾昌guchang.pan@hand-china.com2020/03/20

1.hzero审计

1.搭建审计功能服务端

在hzero选配页面下载该服务:http://hzero.saas.hand-china.com/hzeroStart/

在这里插入图片描述

在这里插入图片描述

注意修改启动类

package com.pigic;

import org.hzero.autoconfigure.monitor.EnableHZeroMonitor;
import org.hzero.core.jackson.annotation.EnableObjectMapper;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import io.choerodon.resource.annoation.EnableChoerodonResourceServer;

@EnableObjectMapper
@EnableHZeroMonitor
@EnableDiscoveryClient
@SpringBootApplication
public class HzeroMonitorApplication {

    public static void main(String[] args) {
        SpringApplication.run(HzeroMonitorApplication.class, args);
    }
}

创建启动脚本

#!/usr/bin/env bash
echo ">>> git pull"
# 拉取代码
git pull

echo ">>> mvn clean package"
# 打包
mvn clean package

echo ">>> cd target"
# 进入target目录
cd target

JAR=hzero-monitor.jar
# 管理端口
MPORT=8261

echo ">>> kill -9 $(jps -ml | grep $JAR | awk '{print $1}')"
# 关闭原有的服务端口
kill -9 $(jps -ml | grep $JAR | awk '{print $1}')

echo ">>> kill -9 $(lsof -n -P -t -i:$MPORT)"
# 关闭原有的监控端口
kill -9 $(lsof -t -sTCP:LISTEN -i:$MPORT)

# 重命名
mv app.jar $JAR

echo ">>> nohup java -jar -Xms512m -Xmx1024m $JAR >app.log &"
# 构建
BUILD_ID=dontKillMe nohup java -jar -Xms512m -Xmx1024m $JAR >app.log &

在服务器通过SSH方式拉取服务

[root@choerodon src]# git clone ssh://git@172.28.8.102:2222/root/hzero-monitor.git
正克隆到 'hzero-monitor'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 34 (delta 0), reused 0 (delta 0)
接收对象中: 100% (34/34), 15.33 KiB | 0 bytes/s, done.
[root@choerodon src]# cd hzero-monitor/
[root@choerodon hzero-monitor]# ls
charts  init-database.sh  pom.xml  README.md  run.sh  src
[root@choerodon hzero-monitor]# chmod 777 run.sh 
[root@choerodon hzero-monitor]# ls
charts  init-database.sh  pom.xml  README.md  run.sh  src
[root@choerodon hzero-monitor]# ./run.sh

至此审计服务可以正常使用

在这里插入图片描述

配置jenkins CI/CD部署代码

在这里插入图片描述

在这里插入图片描述

2.操作审计

添加依赖

<dependency>
    <groupId>org.hzero.boot</groupId>
    <artifactId>hzero-boot-monitor</artifactId>
    <version>1.1.0.RELEASE</version>
</dependency>

在服务中添加如下配置来开启操作审计

# application.yml
hzero:
  audit:
    operation:
      enable: true     # 全局开关,默认 false
      api-audit:
        enable: true    # API 审计开关,默认 true,如果全局开关关闭,此值无效
      annotation-audit:
        enable: true    # 注解审计(在Bean的方法上添加@OperationalAudit)开关,默认 true,如果全局开关关闭,此值无效
2.1页面配置操作审计

在这里插入图片描述

服务:待审计的服务

审计接口: 待审计的服务下对应的接口

操作内容: 记录操作内容信息,可以在此记录操作人、请求参数、相应参数等所需的信息,可以根据实际需求来进行配置,支持SPEL表达式。例如:‘User[’+#_userDetails.getRealName()+’]查询数据’。

在这里插入图片描述

2.2 注解方式操作审计

@OperationalAudit 参数说明

  • content
    
    • 参数类型:String
    • 参数说明:操作内容,支持 SpEL 表达式,如果返回空字符串,操作内容为package.class#method
    • 持当前登录的用户信息(如果当前上下文中不存在用户信息,则使用匿名用户 ANONYMOUS),参数名为_userDetail
    • 支持当前方法的参数
    • 支持当前方法的返回值,参数名为_result
  • auditArg
    
    • 参数类型:boolean
    • 参数说明:是否审计操作参数,默认开启
  • auditResult
    
    • 参数类型:boolean
    • 参数说明:是否审计操作结果,默认开启
  • auditData
    
    • 参数类型:boolean
    • 参数说明:是否审计操作数据,默认开启
  • args
    
    • 参数类型:String[]
    • 参数说明:请求参数,支持 SpEL 表达式,如果返回空字符串,参数内容为注解所在方法的参数
  • result
    
    • 参数类型:String
    • 参数说明:请求结果,支持 SpEL 表达式,如果返回空字符串,参数内容为方法的返回值

代码示例

 @OperationalAudit(content = "'User['+#_userDetails.getRealName()+']查询证件管理列表'")
    @ApiOperation(value = "证件管理列表")
    @Permission(level = ResourceLevel.ORGANIZATION)
    @GetMapping
    public ResponseEntity<Page<Cards>> list(Cards cards, @ApiIgnore @SortDefault(value = Cards.FIELD_CARD_ID,
            direction = Sort.Direction.DESC) PageRequest pageRequest) {
        Page<Cards> list = cardsRepository.pageAndSortOption(pageRequest, cards);
        return Results.success(list);
    }

在这里插入图片描述

3.数据审计

实体注册

hzero:
  platform:
    regist-entity:
    # 开启实体类的注册
      enable: true

开启数据审计

hzero:  
  audit:
    operation:
      enable: true
      annotation-audit:
        enable: true
    data:
      enable: true

覆盖源码类

/*
 * 修改实体类扫描
 * @date: 2020/3/21
 * @author: 潘顾昌 <guchang.pan@hand-china.com>
 * @version: 0.0.1
 * @copyright Copyright (c) 2019, Hand
 */
package org.hzero.boot.platform.entity.autoconfigure;

import org.hzero.boot.platform.entity.feign.EntityRegistFeignClient;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@EnableAsync
@ComponentScan({"org.hzero.boot.platform.entity"})
@EnableFeignClients(
        basePackageClasses = {EntityRegistFeignClient.class}
)
@EnableConfigurationProperties({EntityRegistProperties.class})
@EntityRegistScan(
        basePackages = {"org.hzero/**/entity/**","bjja.hzero/**/entity/**"}
)
public class EntityRegistAutoConfiguration {
    public EntityRegistAutoConfiguration() {
    }

    @Bean
    @Qualifier("entityRegistAsyncTaskExecutor")
    public AsyncTaskExecutor entityRegistAsyncTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setThreadNamePrefix("entityRegistAsyncTaskExecutor");
        executor.setMaxPoolSize(3);
        executor.setCorePoolSize(2);
        return executor;
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.操作审计源码解析

org.hzero.boot.monitor.audit.op.OperationalAuditAspect

在这里插入图片描述

在这里插入图片描述

org.hzero.boot.monitor.audit.op.component.sender.FeignOperationalAuditSender

在这里插入图片描述

org.hzero.monitor.api.controller.v1.AuditOpLogController

在这里插入图片描述

在这里插入图片描述

支持的变量

在这里插入图片描述

核心解析代码

public OperationalAudit build() {
            SpelExpressionParser parser = new SpelExpressionParser();
            StandardEvaluationContext context = new StandardEvaluationContext();
            if (this.args != null) {
                context.setVariables(this.args);
            }

            context.setVariable("_result", this.result);
            context.setVariable("_userDetails", this.customUserDetails);
            this.operationalAudit.content = StringUtils.limited(String.valueOf(parser.parseExpression(this.operationalAudit.content).getValue(context)), 480);
            if (this.operationalAudit.auditArgs) {
                if (this.argExpressions != null && this.argExpressions.length > 0) {
                    Map<String, Object> resultArgs = new HashMap(this.argExpressions.length);
                    int i = 0;

                    for(int argExpressionsLength = this.argExpressions.length; i < argExpressionsLength; ++i) {
                        resultArgs.put("arg" + i, parser.parseExpression(this.argExpressions[i]).getValue(context));
                    }

                    this.operationalAudit.args = ObjectMapperHelper.writeValueAsString(resultArgs);
                } else if (!CollectionUtils.isEmpty(this.args)) {
                    this.operationalAudit.args = ObjectMapperHelper.writeValueAsString(this.args);
                }
            }

            if (this.operationalAudit.auditResult) {
                if (StringUtils.hasText(this.resultExpression)) {
                    this.operationalAudit.result = String.valueOf(parser.parseExpression(this.resultExpression).getValue(context));
                } else if (this.result != null) {
                    if (this.result instanceof ResponseEntity) {
                        this.result = ((ResponseEntity)this.result).getBody();
                    }

                    if (this.result != null) {
                        this.operationalAudit.result = ObjectMapperHelper.writeValueAsString(this.result);
                        this.operationalAudit.failed = this.result instanceof Throwable;
                    }
                }
            }

            return this.operationalAudit;
        }

5.数据审计源码解析

实体注册源码分析

是否启用禁用,默认禁用

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

调用平台服务相关接口

在这里插入图片描述

在这里插入图片描述

可以自定义接口继承org.hzero.boot.data.change.handler.DataChangeBaseHandler

doProcess: 数据改变时如何处理

doCommit: 数据改变提交的时候如何处理

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潘顾昌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值