Skip to content

Commit e0cdb29

Browse files
authored
feat: add AddNamedMatchingFunc interface for enfocer (#182)
Signed-off-by: stonex <[email protected]>
1 parent d7aa242 commit e0cdb29

File tree

5 files changed

+16
-4
lines changed

5 files changed

+16
-4
lines changed

casbin/enforcer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,7 @@ class Enforcer : public IEnforcer {
227227
bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2);
228228
bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies);
229229
bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& p2);
230+
bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func);
230231

231232
/*RBAC API member functions.*/
232233
std::vector<std::string> GetRolesForUser(const std::string& name, const std::vector<std::string>& domain = {});

casbin/enforcer_interface.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "./persist/default_watcher.h"
2424
#include "./effect/effector.h"
2525
#include "./model/scope_config.h"
26+
#include "./rbac/default_role_manager.h"
2627

2728
namespace casbin {
2829

@@ -104,7 +105,7 @@ class IEnforcer {
104105
virtual bool HasPolicy(const std::vector<std::string>& params) = 0;
105106
virtual bool HasNamedPolicy(const std::string& p_type, const std::vector<std::string>& params) = 0;
106107
virtual bool AddPolicy(const std::vector<std::string>& params) = 0;
107-
virtual bool AddPolicies(const std::vector<std::vector<std::string>>& rules) = 0;
108+
virtual bool AddPolicies(const std::vector<std::vector<std::string>>& rules) = 0;
108109
virtual bool AddNamedPolicy(const std::string& p_type, const std::vector<std::string>& params) = 0;
109110
virtual bool AddNamedPolicies(const std::string& p_type, const std::vector<std::vector<std::string>>& rules) = 0;
110111
virtual bool RemovePolicy(const std::vector<std::string>& params) = 0;
@@ -132,6 +133,7 @@ class IEnforcer {
132133
virtual bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2) = 0;
133134
virtual bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies) = 0;
134135
virtual bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& p2) = 0;
136+
virtual bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func) = 0;
135137

136138
/* Internal API member functions */
137139
virtual bool addPolicy(const std::string& sec, const std::string& p_type, const std::vector<std::string>& rule) = 0;

casbin/management_api.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,14 @@ bool Enforcer :: UpdateNamedPolicies(const std::string& ptype, const std::vector
340340
return this->updatePolicies("p", ptype, p1, p2);
341341
}
342342

343+
// AddNamedMatchingFunc add MatchingFunc by ptype RoleManager
344+
bool Enforcer :: AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func) {
345+
auto default_rm = dynamic_cast<casbin::DefaultRoleManager*>(this->rm.get());
346+
default_rm->AddMatchingFunc(func);
347+
348+
return true;
349+
}
350+
343351
} // namespace casbin
344352

345353
#endif // MANAGEMENT_API_CPP

include/casbin/casbin_enforcer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ namespace casbin {
129129
virtual bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2) = 0;
130130
virtual bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies) = 0;
131131
virtual bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& p2) = 0;
132+
virtual bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func) = 0;
132133

133134
/* Internal API member functions */
134135
virtual bool addPolicy(const std::string& sec, const std::string& p_type, const std::vector<std::string>& rule) = 0;
@@ -347,6 +348,7 @@ namespace casbin {
347348
bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2);
348349
bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies);
349350
bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& p2);
351+
bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func);
350352

351353
/*RBAC API member functions.*/
352354
std::vector<std::string> GetRolesForUser(const std::string& name, const std::vector<std::string>& domain = {});

tests/model_enforcer_test.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -479,8 +479,7 @@ TEST(TestModelEnforcer, TestRBACModelWithPattern) {
479479
// You can see in policy that: "g2, /book/:id, book_group", so in "g2()" function in the matcher, instead
480480
// of checking whether "/book/:id" equals the obj: "/book/1", it checks whether the pattern matches.
481481
// You can see it as normal RBAC: "/book/:id" == "/book/1" becomes KeyMatch2("/book/:id", "/book/1")
482-
casbin::DefaultRoleManager* rm_tmp = dynamic_cast<casbin::DefaultRoleManager*>(e.rm.get());
483-
rm_tmp->AddMatchingFunc(casbin::KeyMatch2);
482+
e.AddNamedMatchingFunc("p", "", casbin::KeyMatch2);
484483
casbin::Scope scope = InitializeParams("alice", "/book/1", "GET");
485484
TestEnforce(e, scope, true);
486485
scope = InitializeParams("alice", "/book/2", "GET");
@@ -500,7 +499,7 @@ TEST(TestModelEnforcer, TestRBACModelWithPattern) {
500499

501500
// AddMatchingFunc() is actually setting a function because only one function is allowed,
502501
// so when we set "KeyMatch3", we are actually replacing "KeyMatch2" with "KeyMatch3".
503-
rm_tmp->AddMatchingFunc(casbin::KeyMatch3);
502+
e.AddNamedMatchingFunc("p", "", casbin::KeyMatch3);
504503
scope = InitializeParams("alice", "/book2/1", "GET");
505504
TestEnforce(e, scope, true);
506505
scope = InitializeParams("alice", "/book2/2", "GET");

0 commit comments

Comments
 (0)