Redis WatcherEx for Casbin

Clone this repo:
  1. 8adef8a feat: can use existing Redis client in the watcher (#59) by Yang Luo · 8 weeks ago master v2.8.0
  2. ead01f9 feat: upgrade to Casbin v3.9.0 (#58) by Yang Luo · 8 weeks ago v2.7.0
  3. 6c8eb80 feat: improve CI and README badges by Yang Luo · 8 weeks ago v2.6.0
  4. fed3072 feat: bump github.com/redis/go-redis/v9 (#43) by Jason McNeil · 3 years ago v2.5.0
  5. bc6a61d docs: fix README.md typo (#39) by zac.kim · 3 years, 4 months ago v2.4.1

Redis Watcher

Go Report Card Go Coverage Status Godoc Release Discord Sourcegraph

Redis Watcher is a Redis watcher for Casbin.

Installation

go get github.com/casbin/redis-watcher/v2

Simple Example

package main

import (
	"fmt"
	"log"

	"github.com/casbin/casbin/v3"
	rediswatcher "github.com/casbin/redis-watcher/v2"
	"github.com/redis/go-redis/v9"
)

func updateCallback(msg string) {
	log.Println(msg)
}

func main() {
	// Initialize the watcher.
	// Use the Redis host as parameter.
	w, _ := rediswatcher.NewWatcher("localhost:6379", rediswatcher.WatcherOptions{
		Options: redis.Options{
			Network:  "tcp",
			Password: "",
		},
		Channel:    "/casbin",
		// Only exists in test, generally be true
		IgnoreSelf: false,
	})

	// Or initialize the watcher in redis cluster.
	// w, _ := rediswatcher.NewWatcherWithCluster("localhost:6379,localhost:6379,localhost:6379", rediswatcher.WatcherOptions{
	// 	ClusterOptions: redis.ClusterOptions{
	// 		Password: "",
	// 	},
	// 	Channel: "/casbin",
	// 	IgnoreSelf: false,
	// })

	// Initialize the enforcer.
	e, _ := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

	// Set the watcher for the enforcer.
	_ = e.SetWatcher(w)

	// Set callback to local example
	_ = w.SetUpdateCallback(updateCallback)
	
	// Or use the default callback
	// _ = w.SetUpdateCallback(rediswatcher.DefaultUpdateCallback(e))

	// Update the policy to test the effect.
	// You should see "[casbin rules updated]" in the log.
	_ = e.SavePolicy()
	// Only exists in test
	fmt.Scanln()
}

Using Existing Redis Client

If you already have an existing Redis client instance (e.g., due to restricted access to connection details or centralized Redis setup), you can reuse it to create a watcher.

With Regular Redis Client

package main

import (
	"fmt"

	"github.com/casbin/casbin/v3"
	rediswatcher "github.com/casbin/redis-watcher/v2"
	"github.com/redis/go-redis/v9"
)

func main() {
	// Create your own Redis client
	redisClient := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})

	// Initialize the watcher with existing client
	// Pass empty string for addr since the SubClient and PubClient are already provided
	w, _ := rediswatcher.NewWatcher("", rediswatcher.WatcherOptions{
		SubClient: redisClient,
		PubClient: redisClient,
		Channel:   "/casbin",
	})

	// Initialize the enforcer.
	e, _ := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

	// Set the watcher for the enforcer.
	_ = e.SetWatcher(w)

	// Set callback
	_ = w.SetUpdateCallback(rediswatcher.DefaultUpdateCallback(e))

	// Update the policy to test the effect.
	_ = e.SavePolicy()
	fmt.Scanln()
}

With Redis Cluster Client

package main

import (
	"fmt"

	"github.com/casbin/casbin/v3"
	rediswatcher "github.com/casbin/redis-watcher/v2"
	"github.com/redis/go-redis/v9"
)

func main() {
	// Create your own Redis cluster client
	clusterClient := redis.NewClusterClient(&redis.ClusterOptions{
		Addrs:    []string{"localhost:7000", "localhost:7001", "localhost:7002"},
		Password: "",
	})

	// Initialize the watcher with existing cluster client
	// Pass empty string for addrs since the SubClient and PubClient are already provided
	w, _ := rediswatcher.NewWatcherWithCluster("", rediswatcher.WatcherOptions{
		SubClient: clusterClient,
		PubClient: clusterClient,
		Channel:   "/casbin",
	})

	// Initialize the enforcer.
	e, _ := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

	// Set the watcher for the enforcer.
	_ = e.SetWatcher(w)

	// Set callback
	_ = w.SetUpdateCallback(rediswatcher.DefaultUpdateCallback(e))

	// Update the policy to test the effect.
	_ = e.SavePolicy()
	fmt.Scanln()
}

Getting Help

License

This project is under Apache 2.0 License. See the LICENSE file for the full license text.