ResScope(Off/On/All 三选一)改成 ResFlags 位标志:ResRow/ResRowRelations 管行级权限过滤,ResMask/ResMaskRelations 管字段级脱敏,两个维度可以按位独立组合(*Relations 那两位只保留定义,还没接入判断逻辑)。WithRolesScope 改名 WithPermission(req.ResFlags),dataProcessor 里原来单一的 skipPermission 拆成 skipRowFilter/skipFieldMask 分别控制。
53 lines
1.5 KiB
Go
Executable File
53 lines
1.5 KiB
Go
Executable File
package req
|
|
|
|
import "git.fsdpf.net/go/db"
|
|
|
|
type ResOptions struct {
|
|
Tx *db.TxDatabase
|
|
Alias string
|
|
Silent bool
|
|
// Permission 默认零值 0:不传 WithPermission 时,行级过滤和字段脱敏都跳过;显式传
|
|
// ResRow/ResMask(或组合 ResAll)才会开启对应的检查,两者相互独立。
|
|
Permission ResFlags
|
|
}
|
|
|
|
type ResOption func(p *ResOptions)
|
|
|
|
func WithTx(tx *db.TxDatabase) ResOption {
|
|
return func(p *ResOptions) {
|
|
p.Tx = tx
|
|
}
|
|
}
|
|
|
|
func WithAlias(as string) ResOption {
|
|
return func(p *ResOptions) {
|
|
p.Alias = as
|
|
}
|
|
}
|
|
|
|
// WithSilent 让这次写操作跳过变更通知(ResChangeEventFunc/ResWatcher),权限过滤、字段脱敏、
|
|
// 字段规范化、类型转换、默认值填充等都不受影响。用于类似"记录登录 IP"这种高频写、但不需要广播
|
|
// "资源变了"的场景,避免不必要的缓存刷新/watcher 触发。
|
|
func WithSilent() ResOption {
|
|
return func(p *ResOptions) {
|
|
p.Silent = true
|
|
}
|
|
}
|
|
|
|
// WithPermission 显式指定这次写/查操作要开启哪些权限检查。ResRow 开启行级过滤(WHERE 注入),
|
|
// ResMask 开启字段级脱敏(读脱敏、写权限),两者可以按位组合传,也可以只传一个;不调用这个 option
|
|
// 时两者都跳过。变更通知、字段规范化、类型转换、默认值填充等不受这个 option 影响。
|
|
func WithPermission(f ResFlags) ResOption {
|
|
return func(p *ResOptions) {
|
|
p.Permission = f
|
|
}
|
|
}
|
|
|
|
type gParamsOpt func(g *gparams)
|
|
|
|
func Session(session string) gParamsOpt {
|
|
return func(g *gparams) {
|
|
g.session = session
|
|
}
|
|
}
|