Java 审核API请求/接口方法的机制/技术

Java 审核API请求/接口方法的机制/技术,java,audit,audit-logging,Java,Audit,Audit Logging,在我的Web API中,我在接口级别声明了各种方法。每个方法的实现都是在服务级别编写的。在声明的每个方法中,我都添加了审计注释,类似这样 CreateStackResponse createStack(@AuditId("id") String id, @AuditModule("module") String module, CreateStackRequest createStackRequest) 我的审核表列有:id、上下文id、消息、详细信息、用户id、模块、子模块 我如何构建一条

在我的Web API中,我在接口级别声明了各种方法。每个方法的实现都是在服务级别编写的。在声明的每个方法中,我都添加了审计注释,类似这样

 CreateStackResponse createStack(@AuditId("id") String id, @AuditModule("module") String module, CreateStackRequest createStackRequest)
我的审核表列有:id、上下文id、消息、详细信息、用户id、模块、子模块

我如何构建一条消息(例如“创建堆栈请求由abc用户发起”)来存储。一个解决方案类似于在服务级别,我将调用一个方法(比如logEvent(必需的参数)),该方法将审计存储在数据库中。我们可以在接口级别使用简单的注释来实现这一点吗? 例如,如何保存审核日志,如aws elastic beanstalk的事件选项卡所示


注释本身不会为代码提供任何行为。所有这些注释都是它们的名称所暗示的……附加到代码中的额外信息。当您的代码在运行时使用内省来查看编译代码的定义并基于这些注释执行操作时,注释的威力就来了

Spring框架广泛地实现了这一点。它查看代码上的注释,并使用它们来决定如何连接应用程序。它通常会围绕您自己的类创建包装器类,以便它可以将自己的逻辑注入到您的代码之上

你当然可以自己做这样的事情,但这不是小事。我建议看看AspectJ,或者其他一些面向方面编程(AOP)
框架。一般来说,我建议学习面向方面编程的思想,因为您想要做的是它看起来要解决的最常见的问题之一。使用Spring框架也将是解决此类问题的一个很好的方法。它包括一个用于执行AOP的模块,“SpringAOP”

无论您如何使用注释来实现这一点,您都在谈论大量的学习和潜在的重构代码以使用第三方软件包。您可能很想放弃使用注释的想法,而只是将简单的日志代码放在主要逻辑中

我刚刚在谷歌上搜索了“使用面向方面的编程进行审计”,得到了很多有趣的点击。这里有一个这样的打击。我不知道它是否是您的最佳资源,但它会让您了解我在这里所说的内容:


好的,所以我必须在AOP侧挖掘更多。有些时候,其他一些方法可以做很多事情。就像在我的例子中,我调用了启动linux实例ec2机器的方法,然后它通过创建ssh连接在该ec2实例内创建用户。因此,这个创建用户也应该获得审核日志。表示创建机器、发送创建机器的请求、成功创建机器、在实例中创建abc用户、成功创建abc用户。在这个序列中是的,我明白了。AOP在这方面是惊人的。一旦你克服了设置它的困难,它几乎是神奇的。主要的是,它几乎是完全透明的,因此您可以获得非常强大的审计功能,而不必通过记录调用来破坏代码。如果操作正确,它还可以捕获未应用日志记录的情况,因此错过了所需的审核点。-顺便说一句,我喜欢你用注释指导审计的想法。您的AOP代码没有理由不能查找这些注释,并根据这些信息分类和指导日志条目。AOP注释中不能有动态值。所以我最终添加了我想要审计的方法,我添加了我的logEvent方法,它接受所需的参数并将其存储在DB中。并将其添加为阻塞队列