blob: df43803933c2e5130aa502590e7ca459357f24cd [file] [log] [blame]
/*
* Copyright 2021 The casbin Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* This is a test file for testing built in functions in casbin
*/
#include <casbin/casbin.h>
#include <gtest/gtest.h>
#include "config_path.h"
namespace {
std::string global_sub;
std::string global_obj;
std::string global_act;
std::string global_domain;
template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParams(const std::string& sub, const std::string& obj, const std::string& act) {
auto evaluator = std::make_shared<T>();
evaluator->InitialObject("r");
// Because of "Short String Optimization", these strings's data is in stack.
// For MSVC compiler, when this stack frame return, these memory will can't access.
// So we need keep this memory accessiable.
global_sub = sub;
global_obj = obj;
global_act = act;
evaluator->PushObjectString("r", "sub", global_sub);
evaluator->PushObjectString("r", "obj", global_obj);
evaluator->PushObjectString("r", "act", global_act);
return evaluator;
}
template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParamsWithoutUsers(const std::string& obj, const std::string& act) {
auto evaluator = std::make_shared<T>();
evaluator->InitialObject("r");
global_obj = obj;
global_act = act;
evaluator->PushObjectString("r", "obj", global_obj);
evaluator->PushObjectString("r", "act", global_act);
return evaluator;
}
template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParamsWithoutResources(const std::string& sub, const std::string& act) {
auto evaluator = std::make_shared<T>();
evaluator->InitialObject("r");
global_sub = sub;
global_act = act;
evaluator->PushObjectString("r", "sub", global_sub);
evaluator->PushObjectString("r", "act", global_act);
return evaluator;
}
template <typename T>
std::shared_ptr<casbin::IEvaluator> InitializeParamsWithDomains(const std::string& sub, const std::string& domain, const std::string& obj, const std::string& act) {
auto evaluator = std::make_shared<T>();
evaluator->InitialObject("r");
global_sub = sub;
global_obj = obj;
global_act = act;
global_domain = domain;
evaluator->PushObjectString("r", "sub", global_sub);
evaluator->PushObjectString("r", "dom", global_domain);
evaluator->PushObjectString("r", "obj", global_obj);
evaluator->PushObjectString("r", "act", global_act);
return evaluator;
}
// casbin::Scope InitializeParamsWithJson(std::shared_ptr<nlohmann::json> sub, std::string obj, std::string act) {
// casbin::Scope scope = casbin::InitializeScope();
// casbin::PushObject(scope, "r");
// casbin::PushStringPropToObject(scope, "r", obj, "obj");
// casbin::PushStringPropToObject(scope, "r", act, "act");
// casbin::PushObject(scope, "sub");
// casbin::PushObjectPropFromJson(scope, *sub, "sub");
// casbin::PushObjectPropToObject(scope, "r", "sub");
// return scope;
// }
// void TestEnforce(casbin::Enforcer& e, casbin::Scope& scope, bool res) {
// auto evaluator = std::make_shared<casbin::DuktapeEvaluator>(scope);
// ASSERT_EQ(res, e.Enforce(evaluator));
// }
void TestEnforce(casbin::Enforcer& e, std::shared_ptr<casbin::IEvaluator> evaluator, bool res) { ASSERT_EQ(res, e.Enforce(evaluator)); }
TEST(TestModelEnforcer, TestBasicModel) {
casbin::Enforcer e(basic_model_path, basic_policy_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestBasicModelWithoutSpaces) {
casbin::Enforcer e(basic_model_without_spaces_path, basic_policy_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestBasicModelNoPolicy) {
casbin::Enforcer e(basic_model_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, false);
}
TEST(TestModelEnforcer, TestBasicModelWithRoot) {
casbin::Enforcer e(basic_with_root_model_path, basic_policy_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestBasicModelWithRootNoPolicy) {
casbin::Enforcer e(basic_with_root_model_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data1", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("root", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestBasicModelWithoutUsers) {
casbin::Enforcer e(basic_without_users_model_path, basic_without_users_policy_path);
auto evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithoutUsers<casbin::ExprtkEvaluator>("data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestBasicModelWithoutResources) {
casbin::Enforcer e(basic_without_resources_model_path, basic_without_resources_policy_path);
auto evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("alice", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("alice", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("bob", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithoutResources<casbin::ExprtkEvaluator>("bob", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModel) {
casbin::Enforcer e(rbac_model_path, rbac_policy_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModelWithResourceRoles) {
casbin::Enforcer e(rbac_with_resource_roles_model_path, rbac_with_resource_roles_policy_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModelWithDomains) {
casbin::Enforcer e(rbac_with_domains_model_path, rbac_with_domains_policy_path);
auto evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModelWithDomainsAtRuntime) {
casbin::Enforcer e(rbac_with_domains_model_path);
std::vector<std::string> params{"admin", "domain1", "data1", "read"};
e.AddPolicy(params);
params = std::vector<std::string>{"admin", "domain1", "data1", "write"};
e.AddPolicy(params);
params = std::vector<std::string>{"admin", "domain2", "data2", "read"};
e.AddPolicy(params);
params = std::vector<std::string>{"admin", "domain2", "data2", "write"};
e.AddPolicy(params);
params = std::vector<std::string>{"alice", "admin", "domain1"};
e.AddGroupingPolicy(params);
params = std::vector<std::string>{"bob", "admin", "domain2"};
e.AddGroupingPolicy(params);
auto evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
TestEnforce(e, evaluator, true);
// Remove all policy rules related to domain1 and data1.
params = std::vector<std::string>{"domain1", "data1"};
e.RemoveFilteredPolicy(1, params);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
TestEnforce(e, evaluator, true);
// Remove the specified policy rule.
params = std::vector<std::string>{"admin", "domain2", "data2", "read"};
e.RemovePolicy(params);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModelWithDomainsAtRuntimeMockAdapter) {
std::shared_ptr<casbin::Adapter> adapter = std::make_shared<casbin::FileAdapter>(rbac_with_domains_policy_path);
casbin::Enforcer e(rbac_with_domains_model_path, adapter);
std::vector<std::string> params{"admin", "domain3", "data1", "read"};
e.AddPolicy(params);
params = std::vector<std::string>{"alice", "admin", "domain3"};
e.AddGroupingPolicy(params);
auto evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain3", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
TestEnforce(e, evaluator, true);
params = std::vector<std::string>{"domain1", "data1"};
e.RemoveFilteredPolicy(1, params);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("alice", "domain1", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
TestEnforce(e, evaluator, true);
params = std::vector<std::string>{"admin", "domain2", "data2", "read"};
e.RemovePolicy(params);
evaluator = InitializeParamsWithDomains<casbin::ExprtkEvaluator>("bob", "domain2", "data2", "read");
TestEnforce(e, evaluator, false);
}
TEST(TestModelEnforcer, TestRBACModelWithDeny) {
casbin::Enforcer e(rbac_with_deny_model_path, rbac_with_deny_policy_path);
std::shared_ptr<casbin::IEvaluator> evaluator;
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModelWithOnlyDeny) {
casbin::Enforcer e(rbac_with_not_deny_model_path, rbac_with_deny_policy_path);
auto evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, false);
}
TEST(TestModelEnforcer, TestRBACModelWithCustomData) {
casbin::Enforcer e(rbac_model_path, rbac_policy_path);
// You can add custom data to a grouping policy, Casbin will ignore it. It is only meaningful to the caller.
// This feature can be used to store information like whether "bob" is an end user (so no subject will inherit "bob")
// For Casbin, it is equivalent to: e.AddGroupingPolicy("bob", "data2_admin")
std::vector<std::string> params{"bob", "data2_admin", "custom_data"};
e.AddGroupingPolicy(params);
auto evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
// You should also take the custom data as a parameter when deleting a grouping policy.
// e.RemoveGroupingPolicy("bob", "data2_admin") won't work.
// Or you can remove it by using RemoveFilteredGroupingPolicy().
params = std::vector<std::string>{"bob", "data2_admin", "custom_data"};
e.RemoveGroupingPolicy(params);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "read");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "data2", "write");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data1", "write");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "read");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "data2", "write");
TestEnforce(e, evaluator, true);
}
TEST(TestModelEnforcer, TestRBACModelWithPattern) {
casbin::Enforcer e(rbac_with_pattern_model_path, rbac_with_pattern_policy_path);
// Here's a little confusing: the matching function here is not the custom function used in matcher.
// It is the matching function used by "g" (and "g2", "g3" if any..)
// 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")
e.AddNamedMatchingFunc("p", "", casbin::KeyMatch2);
auto evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book/1", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book/2", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen/1", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen/2", "GET");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book/1", "GET");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book/2", "GET");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen/1", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen/2", "GET");
TestEnforce(e, evaluator, true);
// AddMatchingFunc() is actually setting a function because only one function is allowed,
// so when we set "KeyMatch3", we are actually replacing "KeyMatch2" with "KeyMatch3".
e.AddNamedMatchingFunc("p", "", casbin::KeyMatch3);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book2/1", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/book2/2", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen2/1", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("alice", "/pen2/2", "GET");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book2/1", "GET");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/book2/2", "GET");
TestEnforce(e, evaluator, false);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen2/1", "GET");
TestEnforce(e, evaluator, true);
evaluator = InitializeParams<casbin::ExprtkEvaluator>("bob", "/pen2/2", "GET");
TestEnforce(e, evaluator, true);
}
} // namespace