A Kubernetes Custom Resource Definition (CRD) adapter for Casbin. With this adapter, Casbin can load policy rules from Kubernetes Custom Resources instead of traditional databases.
go get github.com/casbin/casbin-crd-adapter
The adapter expects CasbinPolicy custom resources with the following structure:
apiVersion: casbin.org/v1alpha1 kind: CasbinPolicy metadata: name: example-policy namespace: default # optional, omit for cluster-scoped spec: policyType: p # or "g" for grouping policies rules: - values: ["alice", "data1", "read"] - values: ["bob", "data2", "write"]
package main import ( "log" "github.com/casbin/casbin/v3" crdadapter "github.com/casbin/casbin-crd-adapter" ) func main() { // Create adapter for namespace-scoped policies adapter, err := crdadapter.NewAdapter("default") if err != nil { log.Fatal(err) } // Create enforcer with the adapter e, err := casbin.NewEnforcer("model.conf", adapter) if err != nil { log.Fatal(err) } // Use the enforcer ok, err := e.Enforce("alice", "data1", "read") if err != nil { log.Fatal(err) } log.Printf("Alice can read data1: %v", ok) }
// Create adapter for cluster-scoped policies adapter, err := crdadapter.NewAdapter("") if err != nil { log.Fatal(err) }
import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/dynamic/fake" crdadapter "github.com/casbin/casbin-crd-adapter" ) func TestWithFakeClient() { scheme := runtime.NewScheme() client := fake.NewSimpleDynamicClient(scheme) adapter := crdadapter.NewAdapterWithClient(client, "default") e, err := casbin.NewEnforcer("model.conf", adapter) // ... }
apiVersion: casbin.org/v1alpha1 kind: CasbinPolicy metadata: name: user-permissions namespace: default spec: policyType: p rules: - values: ["alice", "data1", "read"] - values: ["alice", "data1", "write"] - values: ["bob", "data2", "write"]
apiVersion: casbin.org/v1alpha1 kind: CasbinPolicy metadata: name: role-bindings namespace: default spec: policyType: g rules: - values: ["alice", "admin"] - values: ["bob", "developer"]
[request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
This adapter is read-only by design. All write operations (SavePolicy, AddPolicy, RemovePolicy, RemoveFilteredPolicy) will return ErrWriteNotSupported.
To modify policies, update the Kubernetes CRD resources directly using kubectl or the Kubernetes API:
# Apply a new policy kubectl apply -f policy.yaml # Update existing policy kubectl edit casbinpolicy example-policy -n default # Delete a policy kubectl delete casbinpolicy example-policy -n default
Run the test suite:
go test -v ./...
With coverage:
go test -v -race -coverprofile=coverage.txt -covermode=atomic ./...
go build ./...
go test ./...
Contributions are welcome! Please feel free to submit a Pull Request.
This project is licensed under the Apache 2.0 License - see the LICENSE file for details.