在 Strapi.io 中实施审计跟踪/日志

如何解决在 Strapi.io 中实施审计跟踪/日志

我正在尝试创建一个基本的审计跟踪/日志。这是下面的代码,可以更好地理解我要完成的任务。

const removePasswords = (key,value) =>
  key === "password" ? undefined : value;

const getContentType = (path) => {
  if (path.includes("service-request")) {
    return "Service Request";
  }
  if (path.includes("register")) {
    return "Account Registration";
  }
  if (path.includes("local")) {
    return "Account Login";
  }
  if (path.includes("service")) {
    return "Service";
  }
  if (path.includes("content-types") || path.includes("content-manager")) {
    return "Admin";
  }
  return "Others"
};

const getActionType = (method,path) => {
  if (method.toLowerCase() === "post" && path.includes("service-request")) {
    return "Created Service Request";
  }
  if (method.toLowerCase() === "get" && path.includes("content-manager")) {
    return "Admin content View";
  }
  if (method.toLowerCase() === "post" && path.includes("content-manager")) {
    return "Admin content create";
  }
  if (method.toLowerCase() === "put" && path.includes("content-manager")) {
    return "Admin content update";
  }
  if (method.toLowerCase() === "post" && path.includes("register")) {
    return "User Register";
  }
  if (method.toLowerCase() === "post" && path.includes("local")) {
    return "User log in";
  }

  return "Other Activities"
};
module.exports = (strapi) => {
  return {
    initialize() {
      strapi.app.use(async (ctx,next) => {
        await next();
        console.log("I am running");
        if (ctx.state && ctx.state.user) {
          const entry = {
            contentType: getContentType(ctx._matchedRoute),action: getActionType(ctx.request.method,ctx._matchedRoute),statusCode: ctx.response.status,author: {
              id: ctx.state.user.id,email: ctx.state.user.email,ip: ctx.request.ip,},method: ctx.request.method,route: ctx._matchedRoute,params: ctx.params,request: ctx.request.body,content: ctx.response.body,};
          if (
            (ctx.params.model && ctx.params.model.includes("trail")) ||
            (ctx.params.uid && ctx.params.uid.includes("trail"))
          ) {
            //Do nothing
          } else {
            strapi.services.trails.create(
              JSON.stringify(entry,removePasswords)
            );
          }
        }
        const entry = {
          contentType: getContentType(ctx._matchedRoute),author: {
            id:
              ctx.response.body && ctx.response.body.user
                ? ctx.response.body.user.id
                : "Not found",email:
              ctx.response.body && ctx.response.body.user
                ? ctx.response.body.user.email
                : "Not found",};
        if (
          (ctx.params.model && ctx.params.model.includes("trail")) ||
          (ctx.params.uid && ctx.params.uid.includes("trail"))
        ) {
          //Do nothing
        } else {
            // strapi.log.info(entry)
          strapi.services.trails.create(
            JSON.stringify(entry,removePasswords)
          );
        }
      });
    },};
};

要使上述工作正常运行,您需要进入 localhost://1337 中的 Strapi.io 仪表板并创建一个名为 Trails 的“Collection Type”,并将 9 个条目添加到该集合类型中,如下所示:

  1. contentType:文本
  2. 动作:文本
  3. 内容:JSON
  4. 作者:JSON
  5. 请求:JSON
  6. 方法:文本
  7. 路线:文字
  8. 参数:JSON
  9. 状态代码:数字

解决方法

为了让这个工作,我需要改变这个

module.exports = (strapi) => {

为此

module.exports = strapi => {

然后为了正确保存内容,我必须将调用 service.content_type.create 改为显式而不是 Json.stringify()....

这是我的代码

strapi audit middleware index.js

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?