跳转至主要内容

Watchers

Watcher 让多个 enforcer 实例之间的策略保持同步。当一个 enforcer 更新策略时,它会(通过 etcd、Redis 或 Kafka 等消息总线)通知其他实例,其他实例随之重新加载或更新内存中的策略。这样你可以在负载均衡后面运行多个 enforcer,而不会出现过时的权限。

Watcher 和适配器一样,放在单独的包中实现。下面列出支持的后端。要添加新的后端,请提交 issue 或 PR。

Watcher Type Author Description
PostgreSQL WatcherEx Database @IguteChung WatcherEx for PostgreSQL
Redis WatcherEx KV store Casbin WatcherEx for Redis
Redis Watcher KV store @billcobbler Watcher for Redis
Etcd Watcher KV store Casbin Watcher for etcd
TiKV Watcher KV store Casbin Watcher for TiKV
Kafka Watcher Messaging system @wgarunap Watcher for Apache Kafka
NATS Watcher Messaging system Soluto Watcher for NATS
ZooKeeper Watcher Messaging system Grepsr Watcher for Apache ZooKeeper
NATS, RabbitMQ, GCP Pub/Sub, AWS SNS & SQS, Kafka, InMemory Messaging System @rusenask Watcher based on Go Cloud Dev Kit that works with leading cloud providers and self-hosted infrastructure
NATS, RabbitMQ, GCP Pub/Sub, AWS SNS & SQS, Kafka, InMemory Messaging System @bartventer WatcherEx based on Go Cloud Dev Kit that works with leading cloud providers and self-hosted infrastructure
RocketMQ Watcher Messaging system @fmyxyz Watcher for Apache RocketMQ

WatcherEx​

为支持多个实例之间的增量同步,我们提供了 WatcherEx 接口。这个接口可以在策略变化时通知其他实例,不过目前还没有 WatcherEx 的实现。建议使用 dispatcher 实现这一功能。

与 Watcher 接口相比,WatcherEx 可以区分收到的更新操作类型,例如 AddPolicy 和 RemovePolicy。

WatcherEx API:

API描述
SetUpdateCallback(func(string)) errorSetUpdateCallback 设置回调函数,当数据库中的策略被其他实例修改时,watcher 会调用它。一个典型的回调是Enforcer.LoadPolicy()。
Update() errorUpdate 调用其他实例的更新回调,让它们同步策略。通常在修改数据库中的策略之后调用,例如 Enforcer.SavePolicy()、Enforcer.AddPolicy()、Enforcer.RemovePolicy() 等之后。
Close()Close 停止并释放 watcher。之后不会再调用回调函数。
UpdateForAddPolicy(sec, ptype string, params ...string) errorUpdateForAddPolicy 调用其他实例的更新回调,让它们同步策略。在通过Enforcer.AddPolicy(),Enforcer.AddNamedPolicy(),Enforcer.AddGroupingPolicy()和Enforcer.AddNamedGroupingPolicy()添加策略后调用。
UpdateForRemovePolicy(sec, ptype string, params ...string) errorUpdateForRemovePolicy 调用其他实例的更新回调,让它们同步策略。在通过Enforcer.RemovePolicy(),Enforcer.RemoveNamedPolicy(),Enforcer.RemoveGroupingPolicy()和Enforcer.RemoveNamedGroupingPolicy()删除策略后调用。
UpdateForRemoveFilteredPolicy(sec, ptype string, fieldIndex int, fieldValues ...string) errorUpdateForRemoveFilteredPolicy 调用其他实例的更新回调,让它们同步策略。在Enforcer.RemoveFilteredPolicy(),Enforcer.RemoveFilteredNamedPolicy(),Enforcer.RemoveFilteredGroupingPolicy()和Enforcer.RemoveFilteredNamedGroupingPolicy()之后调用。
UpdateForSavePolicy(model model.Model) errorUpdateForSavePolicy 调用其他实例的更新回调,让它们同步策略。在 Enforcer.SavePolicy() 之后调用。
UpdateForAddPolicies(sec string, ptype string, rules ...[]string) errorUpdateForAddPolicies 调用其他实例的更新回调,让它们同步策略。在Enforcer.AddPolicies(),Enforcer.AddNamedPolicies(),Enforcer.AddGroupingPolicies()和Enforcer.AddNamedGroupingPolicies()之后调用。
UpdateForRemovePolicies(sec string, ptype string, rules ...[]string) errorUpdateForRemovePolicies 调用其他实例的更新回调,让它们同步策略。在 Enforcer.RemovePolicies()、Enforcer.RemoveNamedPolicies()、Enforcer.RemoveGroupingPolicies() 和 Enforcer.RemoveNamedGroupingPolicies() 之后调用。