我正在处理的项目需要一些简单的审计日志记录,以便用户更改其电子邮件,帐单地址等.我们正在使用的对象来自不同的来源,一个是WCF服务,另一个是Web服务.
我已经使用反射实现了以下方法来查找对两个不同对象的属性的更改.这将生成一个属性列表,这些属性与旧值和新值有差异.
public static IList GenerateAuditLogMessages(T originalObject, T changedObject)
{
IList list = new List();
string className = string.Concat("[", originalObject.GetType().Name, "] ");
foreach (PropertyInfo property in originalObject.GetType().GetProperties())
{
Type comparable =
property.PropertyType.GetInterface("System.IComparable");
if (comparable != null)
{
string originalPropertyValue =
property.GetValue(originalObject, null) as string;
string newPropertyValue =
property.GetValue(changedObject, null) as string;
if (originalPropertyValue != newPropertyValue)
{
list.Add(string.Concat(className, property.Name,
" changed from '", originalPropertyValue,
"' to '", newPropertyValue, "'"));
}
}
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找System.IComparable,因为"所有数字类型(如Int32和Double)都实现IComparable,String,Char和DateTime也是如此." 这似乎是找到任何不是自定义类的属性的最佳方法.
利用由WCF或Web服务代理代码生成的PropertyChanged事件听起来不错,但没有为我的审计日志(旧值和新值)提供足够的信息.
如果有更好的方法来寻找输入,谢谢!
@Aaronaught,这里是一些基于执行object.Equals生成正匹配的示例代码:
Address …
Run Code Online (Sandbox Code Playgroud) 我需要在我的grails web app中为文章实现修订系统.在搜索grails论坛,stackoverflow,grails插件和谷歌搜索互联网后,我最终得到了3个选项:
选项1 - 使用grails Envers插件(请参阅http://code.google.com/p/grails-envers-plugin/).有没有人成功使用它?或者在没有插件的情况下使用Envers(请参阅此处),但如何使其与GORM一起使用?
选项2 - 使用Gvers插件我在这里找到:https://github.com/ziftytodd/gvers.我从来没有听过有人使用它,所以有没有人曾经成功使用它?
选项3 - 内置机制.Weceem为Weceem CMS的任何内容创建了版本控制系统.我可以从代码的逻辑和这个伟大的应用程序的设计中汲取灵感,但它似乎有点矫枉过正,我不喜欢使用非标准的解决方案.
所以我的问题是,你建议我做什么?你有没有使用过这些选项?
非常感谢您的见解.
我有一个包含ActiveRecord和ActiveResource模型的庞大项目.我需要使用这些模型实现用户活动的记录,并记录模型属性的更改(保存对象状态或类似的东西).用户或cron rake任务可以进行更改.
我也必须有可能按日期搜索任何数据,任何字段..等等
例如,用最后一个活动生成可读消息也会很好
- 用户Bob将密码更改为*,并在2011-08-12 08:12 发送电子邮件至**
- 员工Jeff在2011-08-12 08:13添加了新合作伙伴:公司名称
- Admin Jack删除了产品:产品名称于2011-09-12 11:11
- 客户Sam订购了新服务:服务名称于2011-09-12 11:12
有人实施这样的记录吗?想法?建议?
我应该使用宝石还是我可以通过观察者不改变模型来做所有逻辑?
我喜欢gem https://github.com/airblade/paper_trail任何人都可以说我怎样才能让它与activeresource一起工作?
我的数据库在每个表上都有一个"LastModifiedUser"列,我打算从进行更改的应用程序中收集登录用户.我不是在谈论数据库用户,所以基本上这只是每个实体上的一个字符串.我想找到一种方法来为每个实体默认这个,以便其他开发人员不必记住在实例化实体时分配它.
所以会发生这样的事情:
using (EntityContext ctx = new EntityContext())
{
MyEntity foo = new MyEntity();
// Trying to avoid having the following line every time
// a new entity is created/added.
foo.LastModifiedUser = Lookupuser();
ctx.Foos.Addobject(foo);
ctx.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud) 我有一个当前的数据库驱动的应用程序,它有几种访问数据的方法.
我需要实现基于上下文的审计,因为当前的数据审计不足以回溯识别导致数据更改的进程.
我目前正在考虑将数据模型隐藏在XAPI(事务API)背后,并且数据模型上的每个操作都必须提供某种形式的识别相关操作或数据更改的原因,这些操作或原因将与审计数据本身一起存储.
任何人都可以为我提供更好的方法来实现基于上下文的审计,这将涵盖对数据库的所有访问吗?或者甚至指出我错过了当前方法中的任何明显缺陷?
提前致谢.
我在大约一周前就SOF提出了一个关于审计SQL数据更改的问题.关于使用触发器的常见问题出现了,在SQL Server 2008中也提到了CDC.
我今天一直在尝试,到目前为止这么好,我看不到它支持的一件事是跟踪谁实际做出了改变.谁执行了这个陈述?
我很想知道是否有人使用CDC进行审核,以及您如何跟踪谁做出了更改?
我正在研究Spring Data JPA 和 Postgres示例。在此示例中,我Auditing
通过以下链接实现:https://www.baeldung.com/database-auditing-jpa和Spring Boot JPA@CreatedDate @LastModifiedDate not being populated when saving the object。审核工作非常好当我执行repository.save时,在这种情况下,两个带有注释的字段@CreatedDate
都@LastModifiedDate
正确保存。
但当我尝试更新该方法时,并没有发生同样的情况。
我开发了以下方法。
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
@Entity
@Table(uniqueConstraints = {
@UniqueConstraint(name="student_name_key",columnNames = {"studentName"})
})
public class Student {
....
....
@Column(name="lastUpdateUser")
private String lastUpdateUser;
@LastModifiedDate
@Column(name="lastUpdateDate", nullable = false)
private LocalDateTime lastUpdateDate;
}
Run Code Online (Sandbox Code Playgroud)
主应用程序
@SpringBootApplication
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = {"com.xxx.xxx.repository"})
@ComponentScan(basePackages = {"com.xxx.yyy","com.xxx.xxx.studentportfolio"})
@EnableCaching
@EnableAsync
@EnableAspectJAutoProxy(proxyTargetClass = true)
@EnableAutoConfiguration(exclude = {ErrorMvcAutoConfiguration.class, SecurityAutoConfiguration.class})
public …
Run Code Online (Sandbox Code Playgroud) 我想为我的 RestAPI 端点编写集成测试,但我正在努力解决 @EnableJpaAuditing。我希望 Spring 审核我的一些实体,因此我创建了以下配置类:
@Configuration
@EnableJpaAuditing
public class PersistenceAuditConfiguration {
}
Run Code Online (Sandbox Code Playgroud)
我将其导入到我的主应用程序配置中:
@ServletComponentScan
@SpringBootApplication
@Import(PersistenceAuditConfiguration.class)
public class TMTWebApplication {
public static void main(String[] args) {
SpringApplication.run(TMTWebApplication.class, args);
}
}
Run Code Online (Sandbox Code Playgroud)
另外,我有一个针对我想要审核的所有实体的抽象基类:
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, allowGetters = true)
public abstract class AuditableEntity extends EpicPojo implements Serializable {
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_at", nullable = false, updatable = false)
@CreatedDate
private Date createdAt;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updated_at", nullable = false)
@LastModifiedDate
private Date updatedAt;
//...and so on
}
Run Code Online (Sandbox Code Playgroud)
在我的 …
我有一个会议对象:
Meeting{id, name, time, CreatedBy, UpdatedBy}
和a
MeetingAssignee{id, MeetingID, EmployeeId, CreatedBy, UpdatedBy)
Meeting,作为Aggregate root,有一个方法AssignEmployee.
当我调用AssignEmployee时,我正要将当前用户传递给Meeting对象,以便它可以相应地更新其审计字段.
但这似乎不对 - 是吗?显然,我可以公开审计字段并在以后更改它们 - 也许是在服务级别?
什么是每个人更新这些字段的首选方法?
请注意:我们没有使用Nhibernate,而是一个自定义的ORM,没有任何自动化的东西.
谢谢.
auditing ×10
java ×2
.net ×1
audit-trail ×1
c# ×1
cdc ×1
entity ×1
grails ×1
hibernate ×1
logging ×1
oracle ×1
oracle10g ×1
plsql ×1
postgresql ×1
python ×1
reflection ×1
ruby ×1
security ×1
spring-boot ×1
sql ×1
versioning ×1