以入侵的方式实现基于Grails+db4o的数据稽查(Audit Trail)

要做Audit Trail,即跟踪记录对数据的所有CRUD操作,实现方式大体分两种类型:

1. Brute Force型,即在代码中写大量的类似于这样的代码

new OpLog(
    // properties ...
).save()

2. 技术技巧型,即使用优雅的事件监听机制。

 

由于使用grails/groovy和db4o,实现Audit Trail显得尤为简洁。

 

首先,写一个简单得不能再简单的打入db4o内部的(不在乎侵入不侵入了,反正已经吊死在grails和db4o上了,反正大家都已经紧密地结合了,反正谁都离不开谁了)持久化事件引擎:

package com.db4o.internal

public class InvasivePersistentEventEngine {
	
	private static HANDLERS = [:]
	static on(evt, handler) {
	    if(HANDLERS[evt] == null) {
	        HANDLERS[evt] = new HashSet()
	    }
	    HANDLERS[evt] << handler
	}
	static fireEvent(evt, obj) {
	    if(!HANDLERS[evt]) {
	        return
	    }
	    for(h in HANDLERS[evt]) {
	        h(obj)
	    }
	}
}
 

然后,稍稍修改一下db4o的两个类(从代码可以看出,是受到db4o的Log Message的启发,只要在configure一下messageLevel,把它设置为自己指定的Integer.MIN_VALUE就可以了)

public abstract class ObjectContainerBase  implements TransientClass, Internal4, ObjectContainerSpec, InternalObjectContainer {
    //...	
    public final int store3(Transaction trans, Object obj, int updateDepth, boolean checkJustSet) {
        //。。。
        if (configImpl().messageLevel() > Const4.STATE) {
            message("" + ref.getID() + " new " + ref.classMetadata().getName());
        }
        //+S.C.
        else if (configImpl().messageLevel() == Integer.MIN_VALUE) {
            InvasivePersistentEventEngine.fireEvent("new", ref.getObject());
        }
	//。。。
    }
}

 

 

public class ObjectReference extends PersistentBase implements ObjectInfo, Activator {
    //...
    private void logEvent(ObjectContainerBase container, String event, final int level) {
        if (container.configImpl().messageLevel() > level) {
            container.message("" + getID() + " " + event + " " + _class.getName());
        }
        //+S.C.
        else if (container.configImpl().messageLevel() == Integer.MIN_VALUE) {
            if(event == "update") {
                InvasivePersistentEventEngine.fireEvent(event, getObject());     
            }
        }
    }
}
 

小小地测试一下,先注入handlers。在Web Console中执行

import com.db4o.internal.InvasivePersistentEventEngine
import framework.utils.GroovyDataUtils
InvasivePersistentEventEngine.on('new', {o->
    println "object created [${o.id}, ${o.version}]: " + GroovyDataUtils.getProperties(o)
})
InvasivePersistentEventEngine.on('update', {o->
    println "object ${o.deleted?'deleted':'updated'} [${o.id}, ${o.version}]: " + GroovyDataUtils.getProperties(o)
})
 

然后执行

new User(username:'t@t.cc', password:'**').save()

输出object created [16eb7e6c-8453-4e3d-8ddb-281470ed64f7, 0]: [username:t@t.cc, locked:null, password:**, profile:null, profileId:null]

继续执行

def user = User.find(username:'t@t.cc')
user.password = 'password_changed'
user.save()

输出object updated [16eb7e6c-8453-4e3d-8ddb-281470ed64f7, 1]: [password:password_changed, username:t@t.cc, locked:null, profile:null, profileId:null]

object created [16eb7e6c-8453-4e3d-8ddb-281470ed64f7_bak_0, 0]: [username:t@t.cc, locked:null, password:**, profile:null, profileId:null]

最后执行删除看一下

def user = User.find(username:'t@t.cc')
user.delete()

输出object deleted [16eb7e6c-8453-4e3d-8ddb-281470ed64f7, 1]: [password:password_changed, username:t@t.cc, locked:null, profile:null, profileId:null]

 

入侵成功。

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值