Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion enforcer.go
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,11 @@ func (e *Enforcer) enforce(matcher string, explains *[]string, rvals ...interfac
for _, ruleName := range ruleNames {
if j, ok := parameters.pTokens[ruleName]; ok {
rule := util.EscapeAssertion(pvals[j])
expWithRule = util.ReplaceEval(expWithRule, rule)
if strings.Contains(rule, ">") || strings.Contains(rule, "<") || strings.Contains(rule, "=") {
expWithRule = util.ReplaceEval(expWithRule, rule)
} else {
expWithRule = util.ReplaceEval(expWithRule, "false")
}
} else {
return false, errors.New("please make sure rule exists in policy when using eval() in matcher")
}
Expand Down
14 changes: 14 additions & 0 deletions examples/abac_with_rbac.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[role_definition]
g = _, _

[matchers]
m = (g(r.sub, p.sub) || eval(p.sub)) && r.act == p.act
4 changes: 4 additions & 0 deletions examples/abac_with_rbac.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
p, admin, post, write
p, r.sub == r.obj.Author, post, write

g, alice, admin
26 changes: 26 additions & 0 deletions model_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -561,6 +561,32 @@ func TestABACPolicy(t *testing.T) {
testEnforce(t, e, sub3, "/data2", "write", false)
}

type testAuthor struct {
Author string
}

func newTestAuthor(name string) testAuthor {
s := testAuthor{}
s.Author = name
return s
}

func TestABACWithRBACPolicy(t *testing.T) {
e, _ := NewEnforcer("examples/abac_with_rbac.conf", "examples/abac_with_rbac.csv")

post := newTestAuthor("bob")

ok, err := e.Enforce("alice", post, "write")
if err != nil || ok != true {
t.Fatal("expected Enforce returns true, nil, but got", ok, err)
}

ok, err = e.Enforce("bob", post, "write")
if err != nil || ok != true {
t.Fatal("expected Enforce returns true, nil, but got", ok, err)
}
}

func TestCommentModel(t *testing.T) {
e, _ := NewEnforcer("examples/comment_model.conf", "examples/basic_policy.csv")
testEnforce(t, e, "alice", "data1", "read", true)
Expand Down