问题标签 [audit-logging]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3501 浏览

entity-framework - 在调用 SaveChanges() 之前添加实体的访问 id

我正在使用 EF 4.3.1,我已经覆盖了上下文中的 SaveChanges(),以便我可以获得对象及其状态的列表并在我的审计日志表中创建条目。我需要将记录的 id 存储在审计日志表中,以便对其进行引用。这是插入记录时出现的问题,因为在保存之前我无法访问 id。有什么方法可以在那时获得 id 吗?

0 投票
0 回答
620 浏览

entity-framework - 使用 Entity Framework 的 ChangeTracker 处理复杂的属性

我会尽量在这篇文章中尽可能地描述。我已经阅读了十几个与我的问题外围相关的 SO 问题,但到目前为止,没有一个与正在发生的事情相匹配。

因此,为了对我们的数据库事务(创建、更新、删除)执行审计日志记录,我们的设计使用了 IAuditable 接口,如下所示:

这三个上下文 ID 与域模型的布局方式有关,如前所述,它们中的一些或全部可能为空,具体取决于被审计的实体(它们用于过滤目的,以便管理员只想查看应用程序特定范围的审核日志)。任何需要对 CUD 操作进行审计的模型只需要实现这个接口。

审计表本身的填充方式是通过位于基本 DbContext 和我们域的上下文之间的 AuditableContext。它包含审计表 DbSets,并使用 EF ChangeTracker 覆盖 SaveChanges 方法,如下所示:

“制作审计记录”过程是一段稍微复杂的代码,它使用反射和其他有趣的东西来提取需要审计的字段(可审计模型有一些方法可以让它们的一些字段“退出”审计)以及所有这些。

所以这个逻辑很好。当我有这样的可审计模型时,问题就来了:

正如所指出的,在大多数情况下,这些上下文审计字段只是模型的标准属性。但是在某些情况下,例如这里,需要从虚拟复杂属性中提取上下文 id。

这最终导致NullReferenceException尝试从 SaveChanges() 方法中获取该属性时 - 它表示虚拟 Bar 属性不存在。我已经阅读了一些有关如何构建 ChangeTracker 以允许延迟加载复杂属性的信息,但我找不到正确的语法。“原始值”列表中不存在这些字段,并且对象状态管理器没有这些字段,我猜是因为它们来自接口而不是直接被审计的实体。

那么有谁知道如何解决这个奇怪的问题?我可以强制急切加载整个对象,包括虚拟属性,而不是显然很顽固的延迟加载吗?

很抱歉这篇冗长的帖子,我觉得这是一个非常具体的问题,可能需要详细信息。

蒂亚!:)

0 投票
0 回答
71 浏览

sql - 可以使用关键字和/或通配符搜索来搜索 SQL Server 审计日志吗?

使用 SQL Server 2012。

我怎样才能做到这一点?

谢谢你。

0 投票
1 回答
1126 浏览

sql-server-2008-r2 - Is it possible to audit the changed values using SQL Server Auditing?

Is it possible to audit the changed values using SQL Server Auditing for stored procedures? Note: I'm not talking about CDC.

I've got basic auditing working, writing to the security log. If I run an INSERT statement, I get a 33205 event contain this [I've removed a lot of the message for clarity]:

And that's great! But if I turn it into a stored procedure with parameters, I get [also edited]:

which is as useful as a chocolate teapot. What use is knowing who did something and when if you don't know what they did? I feel like there ought to be an 'Include parameter values' flag or something but I can't find one. What am I missing, here?

0 投票
2 回答
4669 浏览

java - jpa 非托管实体

假设我必须触发这样的查询:

audit_log没有作为 JPA 实体映射到任何类,我严格不能nn.*_audit_logs

使用本机查询功能,我如何才能最好地将其映射到泛型类?尝试选择新功能,但不确定...因此,感谢您的帮助。

0 投票
5 回答
29000 浏览

mysql - 如何创建触发器以将更改事件添加到审核日志表中

假设我们有50 tables一个数据库,我们想要捕获每个表的列中的所有更改(列的先前值和新值)。将有一个审计表,其中包含以下列:

ID, Server_Name, User_Name, Date_Time, Table_Name, Column_Name, Old_Value,New_Value

将有一个审计表,它将捕获该数据库中所有表的更改。我相信我们可以为该数据库的每个表创建触发器。但是请让我知道如何将所有数据添加到一个审计表中。如果您能给我提供一个非常有用的工作示例。

谢谢和问候, 帕莎

0 投票
3 回答
4996 浏览

c# - 使用 ASP.NET MVC 4 ActionFilter 审核日志记录

我正在使用 ASP.NET MVC 4 构建一个 Web 应用程序,数据存储由 T-SQL 数据库通过实体框架提供。我正在集成审计日志,我想提供一个很好的人类可读的操作摘要,以便我可以提供一个友好的日志视图,其中包含清晰的语句,如“用户 Bob 已登录”、“用户 Alice更新文章'Foo'”等。

审计记录目前包括:

  • 图形用户界面
  • 时间戳
  • 用户身份
  • 动作类别(控制器名称)
  • 动作(动作方法名称)
  • IsError(布尔值;true 表示这是错误记录,或者此操作未成功完成)
  • 序列化细节的blob

目前,我的日志记录使用实现的自定义属性IActionFIlter;该OnActionExecuting()方法记录尝试的操作(将 URL、参数等内容序列化到详细信息 blob),OnActionExecuted()如果没有错误,该方法返回并将 IsError 设置为 true,并将返回的结果或异常附加错误消息和堆栈跟踪等到细节。我想为描述字符串添加另一列,但我看不到一个整洁的方法。

我得到的最远的是将一个字符串传递给属性,例如“用户$用户登录”,然后让日志方法扫描字符串中的 $ 字符并用参数字典中键值匹配的任何内容替换该单词单词(减去 $ 字符)。这有点有限;例如,如果文章是按 ID 号存储的,那么您可以管理的最好是“用户 18 编辑文章 37”。没有真正的方法可以获取用户名或文章标题;您不能将实例数据传递给属性,因为它是在编译时烘焙的,而且我真的不希望我的日志记录方法进行各种数据库调用来获取那种数据,尤其是因为它变得不可能(或至少是真正的痛苦)拥有一个通用的日志记录方法。

所有这一切的替代方法是拥有一个静态审计日志记录类并AuditRecord.WriteLog(foo);在各处调用类似的东西,也许使用某种描述符类我可以使用(或继承自)来描述不同类型的操作,存储所有参数并生成根据需要提供描述字符串,但对我来说似乎不太优雅;我真的很喜欢能够标记[AuditLog]一个方法并知道它会被记录下来。

我想避免大量的条件逻辑,比如在一些大的 switch 语句中使用控制器和动作名称来选择正确的字符串模板。如果我可以在日志记录方法中获取诸如文章标题之类的东西,那就没问题了。有没有一种简洁、简单的方法来做到这一点?

0 投票
0 回答
467 浏览

ruby-on-rails-3 - 为计费目的设计审计跟踪

我们正在开发具有类似于 Amazon DynamoDB 定价模型的 Rails 应用程序(即,灵活地提供您需要的东西)。为了简单起见,假设您可以配置:

  1. 用户数
  2. 您可以创建的文档数量

要求

简而言之,您根据您的配置付费。我们的具体要求如下:

  1. 您根据当月的最高金额支付月费。如果你3号升级到1000个用户,10号降级到500个,你就为1000个用户支付一整个月的费用。
  2. 您可以随时升级。
  3. 您可以每天降级一次。

(乍一看这可能听起来不公平,但我们在这里分配了一些重要的资源。)

我正在寻找一种方法来设计一个数据模型,它可以做我们想要的,而不会妨碍太多。

我考虑过的事情

审计宝石

据我所知,我不能使用像simple_auditpaper_trail这样的宝石。

它们在数据库中存储序列化的模型更改。这对于撤消和版本控制非常有用,但不适用于要求 #1,因为您无法在日期范围内获取更改然后找到 MAX 值(无需在 Ruby 中计算大部分)。

自制解决方案

我可以想象以下自制的解决方案:一个存储类似记录的数据库表

这使得可以:

  • 将所有更改集中在一个地方
  • 查询一个日期范围内的最大值(需求#1)
  • 查询何时允许下一次更改(要求 #3)

该表将在 ActiveRecord(假定after_save)回调中更新,该回调包含在事务中save

由于NIH 综合症,我对自制解决方案感到担忧,也许我对审计宝石的担忧完全没有根据。

或者,只是也许,我忽略了一个方面或整个其他解决方案。你怎么看?

0 投票
0 回答
1994 浏览

python - SQLAlchemy 审计日志;如何处理删除?

我正在使用 SQLAlchemy 附带的版本控制代码示例的修改版本来记录用户 ID 和更改日期。但是,我也想修改它,以便通过标记is_deleted类型标志而不是运行实际 SQL来完成删除DELETE。我的问题是我不确定如何捕获删除并将其替换为更新。

这是我到目前为止所拥有的:

以下是我的使用方法(所有非必要部分均已删除):

在运行该代码之前,数据库当前有一个名为“test”的用户和两个用户所属的组,名为“g:admin”和“g:superadmin”。

它目前所做的是:复制 'test' => 'g:admin' 映射的现有 user_to_group 条目并将其复制到历史表中。然后从 user_to_group 中删除该条目。

我想做的是将值复制到历史表中,然后将 user_to_group 中的条目更新为已version_deleted设置为true.

我正在考虑这样做的方法是从 session.deleted 中获取条目(这就是我更改原始代码顺序的原因)并将其修改为 session.dirty。我只是不确定这样做的“最安全”方式是什么。

另一个问题(可能需要另一个问题)是如何检测另一个表中包含的关系,因为当前系统将“用户”行复制到历史表中,然后更新版本信息,尽管没有进行实际更改到行。

编辑:我决定做一些不同的事情,但仍然有一个问题......我实际上删除了内容并记录另一个历史项目,而不是在活动表中使用“已删除”标志,并记录另一个历史项目,指示删除发生的时间。如果我直接删除一个对象,那么这可以正常工作。如果我从关系中删除一个对象,我将无法正确执行此操作。向关系表发出DELETE获取以删除链接,但我似乎无法弄清楚如何在“create_version”方法中检测到该删除。

例如,如果我这样做:

session.deleted 中没有放置任何对象。我可以通过 检测到某种删除attributes.get_history(obj, prop.key),但它似乎表示删除了一个UserToGroup对象Group(我想检测并记录一个历史项目),但也表示GroupUserToGroup对象中删除了一个(我没有不想做任何事情,因为实际Group没有被删除)。

0 投票
1 回答
438 浏览

c# - 在 c# 中检测 EventClass 审计登录/注销

当用户在 SQL SERVER 中登录和注销时,我需要监视应用程序,因为有时应用程序会意外记录,我需要知道,因为我审核了登录和注销。当我使用 SQL Server Profiler 时,EventClass 列出现“Audit Login”和“Audit Logout”。有没有办法在 C# 中获取那些 SQL Server Profiler 事件?

谢谢并恭祝安康。