diff --git a/casbin/enforcer.h b/casbin/enforcer.h index 3b7d2383..7750969b 100644 --- a/casbin/enforcer.h +++ b/casbin/enforcer.h @@ -227,6 +227,7 @@ class Enforcer : public IEnforcer { bool UpdateNamedPolicy(const std::string& ptype, const std::vector& p1, const std::vector& p2); bool UpdatePolicies(const std::vector>& oldPolices, const std::vector>& newPolicies); bool UpdateNamedPolicies(const std::string& ptype, const std::vector>& p1, const std::vector>& p2); + bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func); /*RBAC API member functions.*/ std::vector GetRolesForUser(const std::string& name, const std::vector& domain = {}); diff --git a/casbin/enforcer_interface.h b/casbin/enforcer_interface.h index 7a7899d3..ce98fab1 100644 --- a/casbin/enforcer_interface.h +++ b/casbin/enforcer_interface.h @@ -23,6 +23,7 @@ #include "./persist/default_watcher.h" #include "./effect/effector.h" #include "./model/scope_config.h" +#include "./rbac/default_role_manager.h" namespace casbin { @@ -104,7 +105,7 @@ class IEnforcer { virtual bool HasPolicy(const std::vector& params) = 0; virtual bool HasNamedPolicy(const std::string& p_type, const std::vector& params) = 0; virtual bool AddPolicy(const std::vector& params) = 0; - virtual bool AddPolicies(const std::vector>& rules) = 0; + virtual bool AddPolicies(const std::vector>& rules) = 0; virtual bool AddNamedPolicy(const std::string& p_type, const std::vector& params) = 0; virtual bool AddNamedPolicies(const std::string& p_type, const std::vector>& rules) = 0; virtual bool RemovePolicy(const std::vector& params) = 0; @@ -132,6 +133,7 @@ class IEnforcer { virtual bool UpdateNamedPolicy(const std::string& ptype, const std::vector& p1, const std::vector& p2) = 0; virtual bool UpdatePolicies(const std::vector>& oldPolices, const std::vector>& newPolicies) = 0; virtual bool UpdateNamedPolicies(const std::string& ptype, const std::vector>& p1, const std::vector>& p2) = 0; + virtual bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func) = 0; /* Internal API member functions */ virtual bool addPolicy(const std::string& sec, const std::string& p_type, const std::vector& rule) = 0; diff --git a/casbin/management_api.cpp b/casbin/management_api.cpp index 84ef74a2..989c4433 100644 --- a/casbin/management_api.cpp +++ b/casbin/management_api.cpp @@ -340,6 +340,14 @@ bool Enforcer :: UpdateNamedPolicies(const std::string& ptype, const std::vector return this->updatePolicies("p", ptype, p1, p2); } +// AddNamedMatchingFunc add MatchingFunc by ptype RoleManager +bool Enforcer :: AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func) { + auto default_rm = dynamic_cast(this->rm.get()); + default_rm->AddMatchingFunc(func); + + return true; +} + } // namespace casbin #endif // MANAGEMENT_API_CPP diff --git a/include/casbin/casbin_enforcer.h b/include/casbin/casbin_enforcer.h index 44a574c0..7188ea9c 100644 --- a/include/casbin/casbin_enforcer.h +++ b/include/casbin/casbin_enforcer.h @@ -129,6 +129,7 @@ namespace casbin { virtual bool UpdateNamedPolicy(const std::string& ptype, const std::vector& p1, const std::vector& p2) = 0; virtual bool UpdatePolicies(const std::vector>& oldPolices, const std::vector>& newPolicies) = 0; virtual bool UpdateNamedPolicies(const std::string& ptype, const std::vector>& p1, const std::vector>& p2) = 0; + virtual bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func) = 0; /* Internal API member functions */ virtual bool addPolicy(const std::string& sec, const std::string& p_type, const std::vector& rule) = 0; @@ -347,6 +348,7 @@ namespace casbin { bool UpdateNamedPolicy(const std::string& ptype, const std::vector& p1, const std::vector& p2); bool UpdatePolicies(const std::vector>& oldPolices, const std::vector>& newPolicies); bool UpdateNamedPolicies(const std::string& ptype, const std::vector>& p1, const std::vector>& p2); + bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func); /*RBAC API member functions.*/ std::vector GetRolesForUser(const std::string& name, const std::vector& domain = {}); diff --git a/tests/model_enforcer_test.cpp b/tests/model_enforcer_test.cpp index b6f9fdf4..0ad6d649 100644 --- a/tests/model_enforcer_test.cpp +++ b/tests/model_enforcer_test.cpp @@ -479,8 +479,7 @@ TEST(TestModelEnforcer, TestRBACModelWithPattern) { // You can see in policy that: "g2, /book/:id, book_group", so in "g2()" function in the matcher, instead // of checking whether "/book/:id" equals the obj: "/book/1", it checks whether the pattern matches. // You can see it as normal RBAC: "/book/:id" == "/book/1" becomes KeyMatch2("/book/:id", "/book/1") - casbin::DefaultRoleManager* rm_tmp = dynamic_cast(e.rm.get()); - rm_tmp->AddMatchingFunc(casbin::KeyMatch2); + e.AddNamedMatchingFunc("p", "", casbin::KeyMatch2); casbin::Scope scope = InitializeParams("alice", "/book/1", "GET"); TestEnforce(e, scope, true); scope = InitializeParams("alice", "/book/2", "GET"); @@ -500,7 +499,7 @@ TEST(TestModelEnforcer, TestRBACModelWithPattern) { // AddMatchingFunc() is actually setting a function because only one function is allowed, // so when we set "KeyMatch3", we are actually replacing "KeyMatch2" with "KeyMatch3". - rm_tmp->AddMatchingFunc(casbin::KeyMatch3); + e.AddNamedMatchingFunc("p", "", casbin::KeyMatch3); scope = InitializeParams("alice", "/book2/1", "GET"); TestEnforce(e, scope, true); scope = InitializeParams("alice", "/book2/2", "GET");