@Aspect
@Component
public class AuditControllerAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private ThreadLocal<AuditRequestInfo> result = new ThreadLocal<>();
protected static final ExecutorService executor = Executors.newFixedThreadPool(20);
private final static Integer ES_TTL = 1000;
private final static String ES_INDEX_AUDIT_LOG = "audit";
private final static String ES_INDEX_TYPE_AUDIT_LOG = "user_op_audit";
@Autowired
private ElasticsearchManager elasticsearchManager;
@Autowired
private AuditRequestHandle requestHandle;
@Pointcut("execution(public * cn.harmonycloud.k8s.oam.api..*.*(..))")
public void auditController() {
}
@Before("auditController()")
public void doBefore(JoinPoint joinPoint){
Date date = new Date();
String opDate = DateUtil.timeFormat.format(date.getTime());
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
AuditRequestInfo requestInfo = new AuditRequestInfo();
try {
requestInfo = requestHandle.parseRequest(request);
if (null != requestInfo) {
String args = requestInfo.getRequestParams();
String method = requestInfo.getMethod();
String remoteIp = requestHandle.getRemoteIp(request);
String url = requestInfo.getUrl();
requestInfo.setRemoteIp(remoteIp);
requestInfo.setActionTime(opDate);
result.set(requestInfo);
logger.info("REQUEST: URL: {}, HTTP_METHOD: {}, ARGS: {}, REMOTE_IP: {}, CLASS_METHOD: {}", new String[]{
url, method, args, remoteIp,
joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()});
}
} catch (Exception e) {
logger.error("spring aop before exception", e);
result.set(requestInfo);
}
}
@AfterReturning(returning = "res", pointcut = "auditController()")
public void doAfterReturning(JoinPoint joinPoint, Object res) {
try {
if (requestHandle.checkUrlInCollection()) {
AuditRequestInfo audit = result.get();
if (audit != null) {
String reString = JSONObject.toJSONString(res);
audit.setResponse(reString);
String opStatus = reString.lastIndexOf("success") > -1 ?
reString.substring(reString.lastIndexOf("success") + 9, reString.length() - 1) : "true";
opStatus = opStatus.indexOf(",") > -1 ? opStatus.substring(0,opStatus.indexOf(",")) : opStatus;
audit.setStatus(opStatus);
result.remove();
doInsertOpToEs(audit);
}
logger.debug("res:", res);
}
} catch (Exception e) {
logger.error("spring aop exception", e);
}
}
@AfterThrowing(throwing = "ex", pointcut = "auditController()")
public void doAfterThrowing(Exception ex) {
try {
if (requestHandle.checkUrlInCollection()) {
AuditRequestInfo audit = result.get();
if (audit != null) {
audit.setResponse("exception");
String opStatus = "false";
audit.setStatus(opStatus);
result.remove();
doInsertOpToEs(audit);
}
}
logger.debug("exception:", ex);
} catch (Exception e) {
logger.error("spring aop exception", e);
}
}
private void doInsertOpToEs(AuditRequestInfo searchResult) throws Exception {
Runnable worker = new Runnable() {
@Override
public void run() {
try {
logger.debug("插入ElasticSearch:");
logger.debug("即将插入es,url:{},remoteIP:{}",searchResult.getUrl(), searchResult.getRemoteIp());
if (elasticsearchManager.getPlatformEsClient() != null) {
String index = generateIndexName();
IndexRequest request=new IndexRequest();
request.index(index).type(ES_INDEX_TYPE_AUDIT_LOG).id(String.valueOf(System.currentTimeMillis())).source(
XContentFactory.jsonBuilder().startObject().field("user", searchResult.getUser())
.field("tenant", searchResult.getTenant()).field("project", searchResult.getProject())
.field("moduleChDesc", searchResult.getModuleChDesc()).field("moduleEnDesc", searchResult.getModuleEnDesc())
.field("actionChDesc", searchResult.getActionChDesc()).field("actionEnDesc", searchResult.getActionEnDesc())
.field("method", searchResult.getMethod()).field("actionTime", searchResult.getActionTime())
.field("requestParams", searchResult.getRequestParams()).field("remoteIp", searchResult.getRemoteIp())
.field("response", searchResult.getResponse()).field("url", searchResult.getUrl())
.field("status", searchResult.getStatus()).field("subject", searchResult.getSubject())
.endObject()).timeout(TimeValue.timeValueMillis(ES_TTL));
IndexResponse indexResponse =elasticsearchManager.getPlatformEsClient().index(request, RequestOptions.DEFAULT);
logger.debug("用户操作插入es结束:{}", searchResult.getUrl() + ";;;" + searchResult.getRemoteIp());
logger.info("用户操作记录插入成功");
}
} catch (Exception e) {
logger.error("用户操作记录插入失败", e);
}
}
};
if (StringUtils.isNotBlank(searchResult.getStatus())) {
executor.execute(worker);
}
}
private String generateIndexName(){
Date now = new Date();
String date = DateUtil.DateToString(now, DateStyle.YYYY_MM_DOT);
String indexName = ES_INDEX_AUDIT_LOG + "-" + date;
return indexName;
}
}