Skip to content

Commit

Permalink
feat: add AddNamedMatchingFunc interface for enfocer (#182)
Browse files Browse the repository at this point in the history
Signed-off-by: stonex <[email protected]>
  • Loading branch information
sheny1xuan authored Jan 22, 2022
1 parent d7aa242 commit e0cdb29
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 4 deletions.
1 change: 1 addition & 0 deletions casbin/enforcer.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ class Enforcer : public IEnforcer {
bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2);
bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies);
bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& p2);
bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func);

/*RBAC API member functions.*/
std::vector<std::string> GetRolesForUser(const std::string& name, const std::vector<std::string>& domain = {});
Expand Down
4 changes: 3 additions & 1 deletion casbin/enforcer_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -104,7 +105,7 @@ class IEnforcer {
virtual bool HasPolicy(const std::vector<std::string>& params) = 0;
virtual bool HasNamedPolicy(const std::string& p_type, const std::vector<std::string>& params) = 0;
virtual bool AddPolicy(const std::vector<std::string>& params) = 0;
virtual bool AddPolicies(const std::vector<std::vector<std::string>>& rules) = 0;
virtual bool AddPolicies(const std::vector<std::vector<std::string>>& rules) = 0;
virtual bool AddNamedPolicy(const std::string& p_type, const std::vector<std::string>& params) = 0;
virtual bool AddNamedPolicies(const std::string& p_type, const std::vector<std::vector<std::string>>& rules) = 0;
virtual bool RemovePolicy(const std::vector<std::string>& params) = 0;
Expand Down Expand Up @@ -132,6 +133,7 @@ class IEnforcer {
virtual bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2) = 0;
virtual bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies) = 0;
virtual bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& 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<std::string>& rule) = 0;
Expand Down
8 changes: 8 additions & 0 deletions casbin/management_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<casbin::DefaultRoleManager*>(this->rm.get());
default_rm->AddMatchingFunc(func);

return true;
}

} // namespace casbin

#endif // MANAGEMENT_API_CPP
2 changes: 2 additions & 0 deletions include/casbin/casbin_enforcer.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ namespace casbin {
virtual bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2) = 0;
virtual bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies) = 0;
virtual bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& 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<std::string>& rule) = 0;
Expand Down Expand Up @@ -347,6 +348,7 @@ namespace casbin {
bool UpdateNamedPolicy(const std::string& ptype, const std::vector<std::string>& p1, const std::vector<std::string>& p2);
bool UpdatePolicies(const std::vector<std::vector<std::string>>& oldPolices, const std::vector<std::vector<std::string>>& newPolicies);
bool UpdateNamedPolicies(const std::string& ptype, const std::vector<std::vector<std::string>>& p1, const std::vector<std::vector<std::string>>& p2);
bool AddNamedMatchingFunc(const std::string& ptype, const std::string& name, casbin::MatchingFunc func);

/*RBAC API member functions.*/
std::vector<std::string> GetRolesForUser(const std::string& name, const std::vector<std::string>& domain = {});
Expand Down
5 changes: 2 additions & 3 deletions tests/model_enforcer_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<casbin::DefaultRoleManager*>(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");
Expand All @@ -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");
Expand Down

0 comments on commit e0cdb29

Please sign in to comment.