casbin-raft is the Dispatcher
for Casbin. Provide a way to synchronize incremental changes of policy based on etcd/raft. With this library, Casbin can ensure the consistency of multiple Casbin instances in distributed situations.
go get -u github.com/casbin/casbin-raft
Only casbin v3 supports the use of dispatcher, so you need to use the code of the beta branch
go get -u github.com/casbin/casbin/v3@beta
package main
import (
"github.com/casbin/casbin/v3"
casbinraft "github.com/casbin/casbin-raft"
)
func main() {
// Must guarantee that the initial state of all instances is the same,
e, _ := casbin.NewSyncedEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
// Need to provide the ID and URL of all nodes in the cluster.
peers := make(map[uint64]string)
peers[1] = "127.0.0.1:8001"
peers[2] = "127.0.0.1:8002"
d := casbinraft.NewDispathcer(1, peers)
e.SetDispathcer(d)
e.EnableautoNotifyDispatcher(true)
go d.Start()
// Then you can continue to use the enforcer normally, and when the policy changes, dispathcer will automatically synchronize all clusters
e.AddPolicy("alice", "data2", "read")
}
casbin-raft supports dynamically adding/removing nodes while runtime, for the new node, you need set the param join
to true.
// peers should also contain all nodes info, although this is not needed by raft, it will be used for tranport between nodes
peers := make(map[uint64]string)
peers[1] = "http://127.0.0.1:8001"
peers[2] = "http://127.0.0.1:8002"
peers[3] = "http://127.0.0.1:8003"
peers[4] = "http://127.0.0.1:8004"
e, err := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
if err != nil {
t.Fatal(err)
}
d := casbinraft.NewDispatcher(4, peers, true)
_ = e.SetDispatcher(d)
e.EnableautoNotifyDispatcher(true)
go d.Start()
for the existing cluster, you can call AddMember
on any node
d.AddMember(4, "http://127.0.0.1:8004")
If you need to remove the node, you can call RemoveMember
on any node
d.RemoveMember(3)
This project is under Apache 2.0 License. See the LICENSE file for the full license text.