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 |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Etcd Adapter | KV store | @mapleafgo | Watcher for etcd |
| Redis Watcher | KV store | Casbin | Watcher for Redis |
| Redis WatcherEx | KV store | Casbin | WatcherEx for Redis |
| Lettuce-Based Redis Watcher | KV store | Casbin | Watcher for Redis based on Lettuce) |
| PostgreSQL Watcher | Database | Casbin | Watcher for PostgreSQL |
| Kafka Watcher | Messaging system | Casbin | Watcher for Apache Kafka |
| ZooKeeper Watcher | Messaging system | Casbin | Watcher for Apache ZooKeeper |
| RabbitMQ Watcher | Messaging system | Casbin | Watcher for RabbitMQ |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Etcd Watcher | KV store | Casbin | Watcher for etcd |
| Redis Watcher | KV store | Casbin | Watcher for Redis |
| Pub/Sub Watcher | Messaging system | Casbin | Watcher for Google Cloud Pub/Sub |
| MongoDB Change Streams Watcher | Database | Casbin | Watcher for MongoDB Change Streams |
| Postgres Watcher | Database | @mcollina | Watcher for PostgreSQL |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Etcd Watcher | KV store | Casbin | Watcher for etcd |
| Redis Watcher | KV store | Casbin | Watcher for Redis |
| Redis Watcher | KV store | ScienceLogic | Watcher for Redis |
| Redis Async Watcher | KV store | @kevinkelin | Watcher for Redis |
| PostgreSQL Watcher | Database | Casbin | Watcher for PostgreSQL |
| RabbitMQ Watcher | Messaging system | Casbin | Watcher for RabbitMQ |
| MongoDB Watcher | Database | @sanguinedab | Watcher for MongoDB |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Redis Watcher | KV store | @Sbou | Watcher for Redis |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Redis Watcher | KV store | CasbinRuby | Watcher for Redis |
| RabbitMQ Watcher | Messaging system | CasbinRuby | Watcher for RabbitMQ |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Redis Watcher | KV store | @Tinywan | Watcher for Redis |
| Watcher | Type | Author | Description |
|---|---|---|---|
| Redis Watcher | KV store | Casbin | Watcher for Redis |
WatcherEx
为支持多个实例之间的增量同步,我们提供了 WatcherEx 接口。这个接口可以在策略变化时通知其他实例,不过目前还没有 WatcherEx 的实现。建议使用 dispatcher 实现这一功能。
与 Watcher 接口相比,WatcherEx 可以区分收到的更新操作类型,例如 AddPolicy 和 RemovePolicy。
WatcherEx API:
| API | 描述 |
|---|---|
| SetUpdateCallback(func(string)) error | SetUpdateCallback 设置回调函数,当数据库中的策略被其他实例修改时,watcher 会调用它。一个典型的回调是Enforcer.LoadPolicy()。 |
| Update() error | Update 调用其他实例的更新回调,让它们同步策略。通常在修改数据库中的策略之后调用,例如 Enforcer.SavePolicy()、Enforcer.AddPolicy()、Enforcer.RemovePolicy() 等 之后。 |
| Close() | Close 停止并释放 watcher。之后不会再调用回调函数。 |
| UpdateForAddPolicy(sec, ptype string, params ...string) error | UpdateForAddPolicy 调用其他实例的更新回调,让它们同步策略。在通过Enforcer.AddPolicy(),Enforcer.AddNamedPolicy(),Enforcer.AddGroupingPolicy()和Enforcer.AddNamedGroupingPolicy()添加策略后调用。 |
| UpdateForRemovePolicy(sec, ptype string, params ...string) error | UpdateForRemovePolicy 调用其他实例的更新回调,让它们同步策略。在通过Enforcer.RemovePolicy(),Enforcer.RemoveNamedPolicy(),Enforcer.RemoveGroupingPolicy()和Enforcer.RemoveNamedGroupingPolicy()删除策略后调用。 |
| UpdateForRemoveFilteredPolicy(sec, ptype string, fieldIndex int, fieldValues ...string) error | UpdateForRemoveFilteredPolicy 调用其他实例的更新回调,让它们同步策略。在Enforcer.RemoveFilteredPolicy(),Enforcer.RemoveFilteredNamedPolicy(),Enforcer.RemoveFilteredGroupingPolicy()和Enforcer.RemoveFilteredNamedGroupingPolicy()之后调用。 |
| UpdateForSavePolicy(model model.Model) error | UpdateForSavePolicy 调用其他实例的更新回调,让它们同步策略。在 Enforcer.SavePolicy() 之后调用。 |
| UpdateForAddPolicies(sec string, ptype string, rules ...[]string) error | UpdateForAddPolicies 调用其他实例的更新回调,让它们同步策略。在Enforcer.AddPolicies(),Enforcer.AddNamedPolicies(),Enforcer.AddGroupingPolicies()和Enforcer.AddNamedGroupingPolicies()之后调用。 |
| UpdateForRemovePolicies(sec string, ptype string, rules ...[]string) error | UpdateForRemovePolicies 调用其他实例的更新回调,让它们同步策略。在 Enforcer.RemovePolicies()、Enforcer.RemoveNamedPolicies()、Enforcer.RemoveGroupingPolicies() 和 Enforcer.RemoveNamedGroupingPolicies() 之后调用。 |