You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@casbin.apache.org by hs...@apache.org on 2026/06/16 13:46:41 UTC
(casbin) branch master updated (6c09ba2 -> a76c740)
This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/casbin.git
from 6c09ba2 fix: Configure GitHub workflows to use concurrency cancel-in-progress for (#1734)
new 52c2b03 fix: update repo path in README
new a76c740 feat: quote CSV fields containing commas in SavePolicy
The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
CONTRIBUTING.md | 6 +--
README.md | 98 +++++++++++++++++-----------------
persist/adapter.go | 18 +++++++
persist/file-adapter/adapter.go | 15 ++++--
persist/string-adapter/adapter.go | 15 ++++--
persist/string-adapter/adapter_test.go | 66 +++++++++++++++++++++++
6 files changed, 156 insertions(+), 62 deletions(-)
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org
(casbin) 02/02: feat: quote CSV fields containing commas in SavePolicy
Posted by hs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin.git
commit a76c74043429d713832b70adad67b71f38883544
Author: Yang Luo <hs...@gmail.com>
AuthorDate: Tue Jun 16 21:46:33 2026 +0800
feat: quote CSV fields containing commas in SavePolicy
---
persist/adapter.go | 18 ++++++++++
persist/file-adapter/adapter.go | 15 +++++---
persist/string-adapter/adapter.go | 15 +++++---
persist/string-adapter/adapter_test.go | 66 ++++++++++++++++++++++++++++++++++
4 files changed, 104 insertions(+), 10 deletions(-)
diff --git a/persist/adapter.go b/persist/adapter.go
index 800e757..c15a4c8 100644
--- a/persist/adapter.go
+++ b/persist/adapter.go
@@ -15,6 +15,7 @@
package persist
import (
+ "bytes"
"encoding/csv"
"strings"
@@ -40,6 +41,23 @@ func LoadPolicyLine(line string, m model.Model) error {
return LoadPolicyArray(tokens, m)
}
+// PolicyLineToCsv serializes a policy type and its rule fields into a CSV-safe line.
+// Fields containing commas are properly quoted so the line can be round-tripped
+// through LoadPolicyLine without corruption.
+func PolicyLineToCsv(ptype string, rule []string) (string, error) {
+ record := append([]string{ptype}, rule...)
+ var buf bytes.Buffer
+ w := csv.NewWriter(&buf)
+ if err := w.Write(record); err != nil {
+ return "", err
+ }
+ w.Flush()
+ if err := w.Error(); err != nil {
+ return "", err
+ }
+ return strings.TrimRight(buf.String(), "\r\n"), nil
+}
+
// LoadPolicyArray loads a policy rule to model.
func LoadPolicyArray(rule []string, m model.Model) error {
key := rule[0]
diff --git a/persist/file-adapter/adapter.go b/persist/file-adapter/adapter.go
index 454b2d1..223581c 100644
--- a/persist/file-adapter/adapter.go
+++ b/persist/file-adapter/adapter.go
@@ -23,7 +23,6 @@ import (
"github.com/casbin/casbin/v3/model"
"github.com/casbin/casbin/v3/persist"
- "github.com/casbin/casbin/v3/util"
)
// Adapter is the file adapter for Casbin.
@@ -68,16 +67,22 @@ func (a *Adapter) SavePolicy(model model.Model) error {
for ptype, ast := range model["p"] {
for _, rule := range ast.Policy {
- tmp.WriteString(ptype + ", ")
- tmp.WriteString(util.ArrayToString(rule))
+ line, err := persist.PolicyLineToCsv(ptype, rule)
+ if err != nil {
+ return err
+ }
+ tmp.WriteString(line)
tmp.WriteString("\n")
}
}
for ptype, ast := range model["g"] {
for _, rule := range ast.Policy {
- tmp.WriteString(ptype + ", ")
- tmp.WriteString(util.ArrayToString(rule))
+ line, err := persist.PolicyLineToCsv(ptype, rule)
+ if err != nil {
+ return err
+ }
+ tmp.WriteString(line)
tmp.WriteString("\n")
}
}
diff --git a/persist/string-adapter/adapter.go b/persist/string-adapter/adapter.go
index c9655ac..388dc01 100644
--- a/persist/string-adapter/adapter.go
+++ b/persist/string-adapter/adapter.go
@@ -21,7 +21,6 @@ import (
"github.com/casbin/casbin/v3/model"
"github.com/casbin/casbin/v3/persist"
- "github.com/casbin/casbin/v3/util"
)
// Adapter is the string adapter for Casbin.
@@ -58,16 +57,22 @@ func (a *Adapter) SavePolicy(model model.Model) error {
var tmp bytes.Buffer
for ptype, ast := range model["p"] {
for _, rule := range ast.Policy {
- tmp.WriteString(ptype + ", ")
- tmp.WriteString(util.ArrayToString(rule))
+ line, err := persist.PolicyLineToCsv(ptype, rule)
+ if err != nil {
+ return err
+ }
+ tmp.WriteString(line)
tmp.WriteString("\n")
}
}
for ptype, ast := range model["g"] {
for _, rule := range ast.Policy {
- tmp.WriteString(ptype + ", ")
- tmp.WriteString(util.ArrayToString(rule))
+ line, err := persist.PolicyLineToCsv(ptype, rule)
+ if err != nil {
+ return err
+ }
+ tmp.WriteString(line)
tmp.WriteString("\n")
}
}
diff --git a/persist/string-adapter/adapter_test.go b/persist/string-adapter/adapter_test.go
index 5e8727b..37fd08e 100644
--- a/persist/string-adapter/adapter_test.go
+++ b/persist/string-adapter/adapter_test.go
@@ -15,10 +15,12 @@
package stringadapter
import (
+ "strings"
"testing"
"github.com/casbin/casbin/v3"
"github.com/casbin/casbin/v3/model"
+ "github.com/casbin/casbin/v3/persist"
)
func Test_KeyMatchRbac(t *testing.T) {
@@ -61,6 +63,70 @@ g, alice, data_group_admin
}
}
+// Test_SavePolicyRoundTripWithCommas verifies that a policy rule whose fields contain
+// commas (e.g. ABAC condition expressions) survives a SavePolicy → LoadPolicy round trip
+// without corruption. See https://github.com/apache/casbin/issues/1733.
+func Test_SavePolicyRoundTripWithCommas(t *testing.T) {
+ conf := `
+[request_definition]
+r = sub, obj, act, cond
+
+[policy_definition]
+p = sub, obj, act, cond
+
+[policy_effect]
+e = some(where (p.eft == allow))
+
+[matchers]
+m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
+`
+ // cond field intentionally contains commas (as in ABAC expressions).
+ condWithComma := `r.attrs in ('val1','val2')`
+ line := "p, alice, data1, read, " + `"` + condWithComma + `"`
+
+ a := NewAdapter(line)
+ m := model.NewModel()
+ if err := m.LoadModelFromText(conf); err != nil {
+ t.Fatalf("load model: %v", err)
+ }
+ e, err := casbin.NewEnforcer(m, a)
+ if err != nil {
+ t.Fatalf("new enforcer: %v", err)
+ }
+
+ // SavePolicy serialises in-memory rules back to the adapter string.
+ if err := e.SavePolicy(); err != nil {
+ t.Fatalf("SavePolicy: %v", err)
+ }
+
+ // The saved line must be a properly quoted CSV so that re-loading produces
+ // exactly one rule with the comma-containing cond field intact.
+ saved := a.Line
+ reloaded := model.NewModel()
+ if err := reloaded.LoadModelFromText(conf); err != nil {
+ t.Fatalf("reload model: %v", err)
+ }
+ for _, l := range strings.Split(saved, "\n") {
+ if l == "" {
+ continue
+ }
+ if err := persist.LoadPolicyLine(l, reloaded); err != nil {
+ t.Fatalf("LoadPolicyLine on saved line %q: %v", l, err)
+ }
+ }
+
+ rules, err := reloaded.GetPolicy("p", "p")
+ if err != nil {
+ t.Fatalf("GetPolicy: %v", err)
+ }
+ if len(rules) != 1 {
+ t.Fatalf("expected 1 rule after round-trip, got %d (saved: %q)", len(rules), saved)
+ }
+ if rules[0][3] != condWithComma {
+ t.Errorf("cond field corrupted after round-trip: got %q, want %q", rules[0][3], condWithComma)
+ }
+}
+
func Test_StringRbac(t *testing.T) {
conf := `
[request_definition]
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org
(casbin) 01/02: fix: update repo path in README
Posted by hs...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
hsluoyz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/casbin.git
commit 52c2b032e89f977fe63e118f9d91afb2c5974a7d
Author: Yang Luo <hs...@gmail.com>
AuthorDate: Tue Jun 16 21:44:47 2026 +0800
fix: update repo path in README
---
CONTRIBUTING.md | 6 ++--
README.md | 98 ++++++++++++++++++++++++++++-----------------------------
2 files changed, 52 insertions(+), 52 deletions(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 4bab59c..cbca33f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,12 +1,12 @@
# How to contribute
-The following is a set of guidelines for contributing to casbin and its libraries, which are hosted at [casbin organization at Github](https://github.com/casbin).
+The following is a set of guidelines for contributing to Apache Casbin and its libraries, which are hosted at [Apache Casbin organization at Github](https://github.com/apache).
This project adheres to the [Contributor Covenant 1.2.](https://www.contributor-covenant.org/version/1/2/0/code-of-conduct.html) By participating, you are expected to uphold this code. Please report unacceptable behavior to info@casbin.com.
## Questions
-- We do our best to have an [up-to-date documentation](https://casbin.org/docs/overview)
+- We do our best to have an [up-to-date documentation](https://casbin.apache.org/docs/overview)
- [Stack Overflow](https://stackoverflow.com) is the best place to start if you have a question. Please use the [casbin tag](https://stackoverflow.com/tags/casbin/info) we are actively monitoring. We encourage you to use Stack Overflow specially for Modeling Access Control Problems, in order to build a shared knowledge base.
- You can also join our [Discord](https://discord.gg/S5UjpzGZjN).
@@ -14,7 +14,7 @@ This project adheres to the [Contributor Covenant 1.2.](https://www.contributor-
Reporting issues are a great way to contribute to the project. We are perpetually grateful about a well-written, through bug report.
-Before raising a new issue, check our [issue list](https://github.com/casbin/casbin/issues) to determine if it already contains the problem that you are facing.
+Before raising a new issue, check our [issue list](https://github.com/apache/casbin/issues) to determine if it already contains the problem that you are facing.
A good bug report shouldn't leave others needing to chase you for more information. Please be as detailed as possible. The following questions might serve as a template for writing a detailed report:
diff --git a/README.md b/README.md
index 89dc9af..a902f7e 100644
--- a/README.md
+++ b/README.md
@@ -1,31 +1,31 @@
-Casbin
+Apache Casbin
====
-[](https://goreportcard.com/report/github.com/casbin/casbin)
-[](https://github.com/casbin/casbin/actions/workflows/default.yml)
-[](https://coveralls.io/github/casbin/casbin?branch=master)
-[](https://pkg.go.dev/github.com/casbin/casbin/v2)
-[](https://github.com/casbin/casbin/releases/latest)
+[](https://goreportcard.com/report/github.com/apache/casbin)
+[](https://github.com/apache/casbin/actions/workflows/default.yml)
+[](https://coveralls.io/github/apache/casbin?branch=master)
+[](https://pkg.go.dev/github.com/casbin/casbin/v2)
+[](https://github.com/apache/casbin/releases/latest)
[](https://discord.gg/S5UjpzGZjN)
-[](https://sourcegraph.com/github.com/casbin/casbin?badge)
+[](https://sourcegraph.com/github.com/apache/casbin?badge)
-**News**: still worry about how to write the correct Casbin policy? ``Casbin online editor`` is coming to help! Try it at: https://casbin.org/editor/
+**News**: still worry about how to write the correct Apache Casbin policy? ``Apache Casbin online editor`` is coming to help! Try it at: https://casbin.apache.org/editor/

-Casbin is a powerful and efficient open-source access control library for Golang projects. It provides support for enforcing authorization based on various [access control models](https://en.wikipedia.org/wiki/Computer_security_model).
+Apache Casbin is a powerful and efficient open-source access control library for Golang projects. It provides support for enforcing authorization based on various [access control models](https://en.wikipedia.org/wiki/Computer_security_model).
-## All the languages supported by Casbin:
+## All the languages supported by Apache Casbin:
-| [](https://github.com/casbin/casbin) | [](https://github.com/casbin/jcasbin) | [](https://github.com/casbin/node-casbin) | [](https://github.com/php-casbin/php-casbin) |
-|----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|
-| [Casbin](https://github.com/casbin/casbin) | [jCasbin](https://github.com/casbin/jcasbin) | [node-Casbin](https://github.com/casbin/node-casbin) | [PHP-Casbin](https://github.com/php-casbin/php-casbin) |
-| production-ready | production-ready | production-ready | production-ready |
+| [](https://github.com/apache/casbin) | [](https://github.com/casbin/jcasbin) | [](https://github.com/casbin/node-casbin) | [](https://github.com/php-casbin/php-casbin) |
+|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
+| [Casbin](https://github.com/apache/casbin) | [jCasbin](https://github.com/casbin/jcasbin) | [node-Casbin](https://github.com/casbin/node-casbin) | [PHP-Casbin](https://github.com/php-casbin/php-casbin) |
+| production-ready | production-ready | production-ready | production-ready |
-| [](https://github.com/casbin/pycasbin) | [](https://github.com/casbin-net/Casbin.NET) | [](https://github.com/casbin/casbin-cpp) | [](https://github.com/casbin/casbin-rs) |
-|------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------|
-| [PyCasbin](https://github.com/casbin/pycasbin) | [Casbin.NET](https://github.com/casbin-net/Casbin.NET) | [Casbin-CPP](https://github.com/casbin/casbin-cpp) | [Casbin-RS](https://github.com/casbin/casbin-rs) |
-| production-ready | production-ready | production-ready | production-ready |
+| [](https://github.com/casbin/pycasbin) | [](https://github.com/casbin-net/Casbin.NET) | [](https://github.com/casbin/casbin-cpp) | [](https://github.com/casbin/casbin-rs) |
+|--------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------|
+| [PyCasbin](https://github.com/casbin/pycasbin) | [Casbin.NET](https://github.com/casbin-net/Casbin.NET) | [Casbin-CPP](https://github.com/casbin/casbin-cpp) | [Casbin-RS](https://github.com/casbin/casbin-rs) |
+| production-ready | production-ready | production-ready | production-ready |
## Table of contents
@@ -120,7 +120,7 @@ For more operators, you may take a look at [govaluate](https://github.com/casbin
## Features
-What Casbin does:
+What Apache Casbin does:
1. enforce the policy in the classic ``{subject, object, action}`` form or a customized form as you defined, both allow and deny authorizations are supported.
2. handle the storage of the access control model and its policy.
@@ -128,10 +128,10 @@ What Casbin does:
4. support built-in superuser like ``root`` or ``administrator``. A superuser can do anything without explicit permissions.
5. multiple built-in operators to support the rule matching. For example, ``keyMatch`` can map a resource key ``/foo/bar`` to the pattern ``/foo*``.
-What Casbin does NOT do:
+What Apache Casbin does NOT do:
1. authentication (aka verify ``username`` and ``password`` when a user logs in)
-2. manage the list of users or roles. I believe it's more convenient for the project itself to manage these entities. Users usually have their passwords, and Casbin is not designed as a password container. However, Casbin stores the user-role mapping for the RBAC scenario.
+2. manage the list of users or roles. I believe it's more convenient for the project itself to manage these entities. Users usually have their passwords, and Apache Casbin is not designed as a password container. However, Apache Casbin stores the user-role mapping for the RBAC scenario.
## Installation
@@ -141,15 +141,15 @@ go get github.com/casbin/casbin/v3
## Documentation
-https://casbin.org/docs/overview
+https://casbin.apache.org/docs/overview
## Online editor
-You can also use the online editor (https://casbin.org/editor/) to write your Casbin model and policy in your web browser. It provides functionality such as ``syntax highlighting`` and ``code completion``, just like an IDE for a programming language.
+You can also use the online editor (https://casbin.apache.org/editor/) to write your Casbin model and policy in your web browser. It provides functionality such as ``syntax highlighting`` and ``code completion``, just like an IDE for a programming language.
## Tutorials
-https://casbin.org/docs/tutorials
+https://casbin.apache.org/docs/tutorials
## Get started
@@ -175,7 +175,7 @@ Note: you can also initialize an enforcer with policy in DB instead of file, see
}
```
-3. Besides the static policy file, Casbin also provides API for permission management at run-time. For example, You can get all the roles assigned to a user as below:
+3. Besides the static policy file, Apache Casbin also provides API for permission management at run-time. For example, You can get all the roles assigned to a user as below:
```go
roles, _ := e.GetImplicitRolesForUser(sub)
@@ -185,12 +185,12 @@ See [Policy management APIs](#policy-management) for more usage.
## Policy management
-Casbin provides two sets of APIs to manage permissions:
+Apache Casbin provides two sets of APIs to manage permissions:
-- [Management API](https://casbin.org/docs/management-api): the primitive API that provides full support for Casbin policy management.
-- [RBAC API](https://casbin.org/docs/rbac-api): a more friendly API for RBAC. This API is a subset of Management API. The RBAC users could use this API to simplify the code.
+- [Management API](https://casbin.apache.org/docs/management-api): the primitive API that provides full support for Apache Casbin policy management.
+- [RBAC API](https://casbin.apache.org/docs/rbac-api): a more friendly API for RBAC. This API is a subset of Management API. The RBAC users could use this API to simplify the code.
-We also provide a [web-based UI](https://casbin.org/docs/admin-portal) for model management and policy management:
+We also provide a [web-based UI](https://casbin.apache.org/docs/admin-portal) for model management and policy management:

@@ -198,43 +198,43 @@ We also provide a [web-based UI](https://casbin.org/docs/admin-portal) for model
## Policy persistence
-https://casbin.org/docs/adapters
+https://casbin.apache.org/docs/adapters
## Policy consistence between multiple nodes
-https://casbin.org/docs/watchers
+https://casbin.apache.org/docs/watchers
## Role manager
-https://casbin.org/docs/role-managers
+https://casbin.apache.org/docs/role-managers
## Benchmarks
-https://casbin.org/docs/benchmark
+https://casbin.apache.org/docs/benchmark
## Examples
| Model | Model file | Policy file |
|---------------------------|----------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
-| ACL | [basic_model.conf](https://github.com/casbin/casbin/blob/master/examples/basic_model.conf) | [basic_policy.csv](https://github.com/casbin/casbin/blob/master/examples/basic_policy.csv) |
-| ACL with superuser | [basic_model_with_root.conf](https://github.com/casbin/casbin/blob/master/examples/basic_with_root_model.conf) | [basic_policy.csv](https://github.com/casbin/casbin/blob/master/examples/basic_policy.csv) |
-| ACL without users | [basic_model_without_users.conf](https://github.com/casbin/casbin/blob/master/examples/basic_without_users_model.conf) | [basic_policy_without_users.csv](https://github.com/casbin/casbin/blob/master/examples/basic_without_users_policy.csv) |
-| ACL without resources | [basic_model_without_resources.conf](https://github.com/casbin/casbin/blob/master/examples/basic_without_resources_model.conf) | [basic_policy_without_resources.csv](https://github.com/casbin/casbin/blob/master/examples/basic_without_resources_policy.csv) |
-| RBAC | [rbac_model.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_model.conf) | [rbac_policy.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_policy.csv) |
-| RBAC with resource roles | [rbac_model_with_resource_roles.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_with_resource_roles_model.conf) | [rbac_policy_with_resource_roles.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_with_resource_roles_policy.csv) |
-| RBAC with domains/tenants | [rbac_model_with_domains.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_with_domains_model.conf) | [rbac_policy_with_domains.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_with_domains_policy.csv) |
-| ABAC | [abac_model.conf](https://github.com/casbin/casbin/blob/master/examples/abac_model.conf) | N/A |
-| RESTful | [keymatch_model.conf](https://github.com/casbin/casbin/blob/master/examples/keymatch_model.conf) | [keymatch_policy.csv](https://github.com/casbin/casbin/blob/master/examples/keymatch_policy.csv) |
-| Deny-override | [rbac_model_with_deny.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_with_deny_model.conf) | [rbac_policy_with_deny.csv](https://github.com/casbin/casbin/blob/master/examples/rbac_with_deny_policy.csv) |
-| Priority | [priority_model.conf](https://github.com/casbin/casbin/blob/master/examples/priority_model.conf) | [priority_policy.csv](https://github.com/casbin/casbin/blob/master/examples/priority_policy.csv) |
+| ACL | [basic_model.conf](https://github.com/apache/casbin/blob/master/examples/basic_model.conf) | [basic_policy.csv](https://github.com/apache/casbin/blob/master/examples/basic_policy.csv) |
+| ACL with superuser | [basic_model_with_root.conf](https://github.com/apache/casbin/blob/master/examples/basic_with_root_model.conf) | [basic_policy.csv](https://github.com/apache/casbin/blob/master/examples/basic_policy.csv) |
+| ACL without users | [basic_model_without_users.conf](https://github.com/apache/casbin/blob/master/examples/basic_without_users_model.conf) | [basic_policy_without_users.csv](https://github.com/apache/casbin/blob/master/examples/basic_without_users_policy.csv) |
+| ACL without resources | [basic_model_without_resources.conf](https://github.com/apache/casbin/blob/master/examples/basic_without_resources_model.conf) | [basic_policy_without_resources.csv](https://github.com/apache/casbin/blob/master/examples/basic_without_resources_policy.csv) |
+| RBAC | [rbac_model.conf](https://github.com/apache/casbin/blob/master/examples/rbac_model.conf) | [rbac_policy.csv](https://github.com/apache/casbin/blob/master/examples/rbac_policy.csv) |
+| RBAC with resource roles | [rbac_model_with_resource_roles.conf](https://github.com/apache/casbin/blob/master/examples/rbac_with_resource_roles_model.conf) | [rbac_policy_with_resource_roles.csv](https://github.com/apache/casbin/blob/master/examples/rbac_with_resource_roles_policy.csv) |
+| RBAC with domains/tenants | [rbac_model_with_domains.conf](https://github.com/apache/casbin/blob/master/examples/rbac_with_domains_model.conf) | [rbac_policy_with_domains.csv](https://github.com/apache/casbin/blob/master/examples/rbac_with_domains_policy.csv) |
+| ABAC | [abac_model.conf](https://github.com/apache/casbin/blob/master/examples/abac_model.conf) | N/A |
+| RESTful | [keymatch_model.conf](https://github.com/apache/casbin/blob/master/examples/keymatch_model.conf) | [keymatch_policy.csv](https://github.com/apache/casbin/blob/master/examples/keymatch_policy.csv) |
+| Deny-override | [rbac_model_with_deny.conf](https://github.com/apache/casbin/blob/master/examples/rbac_with_deny_model.conf) | [rbac_policy_with_deny.csv](https://github.com/apache/casbin/blob/master/examples/rbac_with_deny_policy.csv) |
+| Priority | [priority_model.conf](https://github.com/apache/casbin/blob/master/examples/priority_model.conf) | [priority_policy.csv](https://github.com/apache/casbin/blob/master/examples/priority_policy.csv) |
## Middlewares
-Authz middlewares for web frameworks: https://casbin.org/docs/middlewares
+Authz middlewares for web frameworks: https://casbin.apache.org/docs/middlewares
## Our adopters
-https://casbin.org/docs/adopters
+https://casbin.apache.org/docs/adopters
## How to Contribute
@@ -243,11 +243,11 @@ Please read the [contributing guide](CONTRIBUTING.md).
## Contributors
This project exists thanks to all the people who contribute.
-<a href="https://github.com/casbin/casbin/graphs/contributors"><img src="https://opencollective.com/casbin/contributors.svg?width=890&button=false" /></a>
+<a href="https://github.com/apache/casbin/graphs/contributors"><img src="https://opencollective.com/casbin/contributors.svg?width=890&button=false" /></a>
## Star History
-[](https://star-history.com/#casbin/casbin&Date)
+[](https://star-history.com/#apache/casbin&Date)
## License
@@ -256,5 +256,5 @@ This project is licensed under the [Apache 2.0 license](LICENSE).
## Contact
If you have any issues or feature requests, please contact us. PR is welcomed.
-- https://github.com/casbin/casbin/issues
+- https://github.com/apache/casbin/issues
- https://discord.gg/S5UjpzGZjN
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@casbin.apache.org
For additional commands, e-mail: commits-help@casbin.apache.org