Skip to content

Commit abf9092

Browse files
authored
feat: improve the synced enforcer like Go casbin (#248)
1 parent eb321d7 commit abf9092

File tree

3 files changed

+135
-2
lines changed

3 files changed

+135
-2
lines changed

casbin/enforcer_synced.cpp

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,81 @@ bool SyncedEnforcer ::RemoveFilteredNamedGroupingPolicy(const std::string& ptype
513513
return Enforcer::RemoveFilteredNamedGroupingPolicy(ptype, fieldIndex, fieldValues);
514514
}
515515

516+
// GetAllActions gets the list of actions that show up in the current policy.
517+
std::vector<std::string> SyncedEnforcer::GetAllActions() {
518+
std::unique_lock<std::shared_mutex> lock(policyMutex);
519+
return Enforcer::GetAllActions();
520+
}
521+
522+
// GetFilteredPolicy gets all the authorization rules in the policy, field filters can be specified.
523+
PoliciesValues SyncedEnforcer::GetFilteredPolicy(int fieldIndex, std::vector<std::string> fieldValues) {
524+
std::unique_lock<std::shared_mutex> lock(policyMutex);
525+
return Enforcer::GetFilteredPolicy(fieldIndex, fieldValues);
526+
}
527+
528+
// EnforceExWithMatcher use a custom matcher and explain enforcement by informing matched rules.
529+
bool SyncedEnforcer::SyncedEnforceExWithMatcher(const std::string& matcher, std::shared_ptr<IEvaluator> evalator, std::vector<std::string>& explain) {
530+
std::unique_lock<std::shared_mutex> lock(policyMutex);
531+
return Enforcer::EnforceExWithMatcher(matcher, evalator, explain);
532+
}
533+
534+
bool SyncedEnforcer::SyncedEnforceExWithMatcher(const std::string& matcher, const DataList& params, std::vector<std::string>& explain) {
535+
std::unique_lock<std::shared_mutex> lock(policyMutex);
536+
return Enforcer::EnforceExWithMatcher(matcher, params, explain);
537+
}
538+
539+
bool SyncedEnforcer::SyncedEnforceExWithMatcher(const std::string& matcher, const DataVector& params, std::vector<std::string>& explain) {
540+
std::unique_lock<std::shared_mutex> lock(policyMutex);
541+
return Enforcer::EnforceExWithMatcher(matcher, params, explain);
542+
}
543+
544+
bool SyncedEnforcer::SyncedEnforceExWithMatcher(const std::string& matcher, const DataMap& params, std::vector<std::string>& explain) {
545+
std::unique_lock<std::shared_mutex> lock(policyMutex);
546+
return Enforcer::EnforceExWithMatcher(matcher, params, explain);
547+
}
548+
549+
// EnforceEx explain enforcement by informing matched rules.
550+
bool SyncedEnforcer::SyncedEnforceEx(std::shared_ptr<IEvaluator> evalator, std::vector<std::string>& explain) {
551+
std::unique_lock<std::shared_mutex> lock(policyMutex);
552+
return Enforcer::EnforceEx(evalator, explain);
553+
}
554+
555+
bool SyncedEnforcer::SyncedEnforceEx(const DataList& params, std::vector<std::string>& explain) {
556+
std::unique_lock<std::shared_mutex> lock(policyMutex);
557+
return Enforcer::EnforceEx(params, explain);
558+
}
559+
560+
bool SyncedEnforcer::SyncedEnforceEx(const DataVector& params, std::vector<std::string>& explain) {
561+
std::unique_lock<std::shared_mutex> lock(policyMutex);
562+
return Enforcer::EnforceEx(params, explain);
563+
}
564+
565+
bool SyncedEnforcer::SyncedEnforceEx(const DataMap& params, std::vector<std::string>& explain) {
566+
std::unique_lock<std::shared_mutex> lock(policyMutex);
567+
return Enforcer::EnforceEx(params, explain);
568+
}
569+
570+
// EnforceWithMatcher use a custom matcher to decides whether a "subject" can access a "object" with the operation "action", input parameters are usually: (matcher, sub, obj, act), use model matcher by default when matcher is "".
571+
bool SyncedEnforcer::SyncedEnforceWithMatcher(const std::string& matcher, std::shared_ptr<IEvaluator> evalator) {
572+
std::unique_lock<std::shared_mutex> lock(policyMutex);
573+
return Enforcer::EnforceWithMatcher(matcher, evalator);
574+
}
575+
576+
bool SyncedEnforcer::SyncedEnforceWithMatcher(const std::string& matcher, const DataList& params) {
577+
std::unique_lock<std::shared_mutex> lock(policyMutex);
578+
return Enforcer::EnforceWithMatcher(matcher, params);
579+
}
580+
581+
bool SyncedEnforcer::SyncedEnforceWithMatcher(const std::string& matcher, const DataVector& params) {
582+
std::unique_lock<std::shared_mutex> lock(policyMutex);
583+
return Enforcer::EnforceWithMatcher(matcher, params);
584+
}
585+
586+
bool SyncedEnforcer::SyncedEnforceWithMatcher(const std::string& matcher, const DataMap& params) {
587+
std::unique_lock<std::shared_mutex> lock(policyMutex);
588+
return Enforcer::EnforceWithMatcher(matcher, params);
589+
}
590+
516591
} // namespace casbin
517592

518-
#endif // ENFORCER_SYNCED_CPP
593+
#endif // ENFORCER_SYNCED_CPP

include/casbin/enforcer_synced.h

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,42 @@ class SyncedEnforcer : public Enforcer {
292292

293293
// RemoveFilteredNamedGroupingPolicy removes a role inheritance rule from the current named policy, field filters can be specified.
294294
bool RemoveFilteredNamedGroupingPolicy(const std::string& ptype, int fieldIndex, const std::vector<std::string>& fieldValues) override;
295+
296+
// GetAllActions gets the list of actions that show up in the current policy.
297+
298+
std::vector<std::string> GetAllActions() override;
299+
300+
// GetFilteredPolicy gets all the authorization rules in the policy, field filters can be specified.
301+
PoliciesValues GetFilteredPolicy(int fieldIndex, std::vector<std::string> fieldValues);
302+
303+
// EnforceExWithMatcher use a custom matcher and explain enforcement by informing matched rules.
304+
bool SyncedEnforceExWithMatcher(const std::string& matcher, std::shared_ptr<IEvaluator> evalator, std::vector<std::string>& explain);
305+
306+
bool SyncedEnforceExWithMatcher(const std::string& matcher, const DataList& params, std::vector<std::string>& explain);
307+
308+
bool SyncedEnforceExWithMatcher(const std::string& matcher, const DataVector& params, std::vector<std::string>& explain);
309+
310+
bool SyncedEnforceExWithMatcher(const std::string& matcher, const DataMap& params, std::vector<std::string>& explain);
311+
312+
// EnforceEx explain enforcement by informing matched rules.
313+
bool SyncedEnforceEx(std::shared_ptr<IEvaluator> evalator, std::vector<std::string>& explain);
314+
315+
bool SyncedEnforceEx(const DataList& params, std::vector<std::string>& explain);
316+
317+
bool SyncedEnforceEx(const DataVector& params, std::vector<std::string>& explain);
318+
319+
bool SyncedEnforceEx(const DataMap& params, std::vector<std::string>& explain);
320+
321+
// EnforceWithMatcher use a custom matcher to decides whether a "subject" can access a "object" with the operation "action", input parameters are usually: (matcher, sub, obj, act), use model
322+
bool SyncedEnforceWithMatcher(const std::string& matcher, std::shared_ptr<IEvaluator> evalator);
323+
324+
bool SyncedEnforceWithMatcher(const std::string& matcher, const DataList& params);
325+
326+
bool SyncedEnforceWithMatcher(const std::string& matcher, const DataVector& params);
327+
328+
bool SyncedEnforceWithMatcher(const std::string& matcher, const DataMap& params);
295329
};
296330

297331
} // namespace casbin
298332

299-
#endif
333+
#endif

tests/enforcer_synced_test.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,4 +334,28 @@ TEST(TestEnforcerSynced, TestMultiThreadBatchEnforce) {
334334
EXPECT_EQ(e.IsAutoLoadingRunning(), false);
335335
}
336336

337+
void testSyncedEnforcerGetPolicy(casbin::SyncedEnforcer& e, PoliciesVector expected) {
338+
auto myRes = e.GetPolicy();
339+
PoliciesVector actual;
340+
for (auto it = myRes.begin(); it != myRes.end(); ++it) {
341+
actual.push_back(*it);
342+
}
343+
std::sort(actual.begin(), actual.end());
344+
std::sort(expected.begin(), expected.end());
345+
ASSERT_EQ(expected, actual);
346+
}
347+
348+
TEST(TestSyncedEnforcer, GetPolicy) {
349+
casbin::SyncedEnforcer e(basic_model_path, basic_policy_path);
350+
351+
PoliciesVector expected_policy = {
352+
{"alice", "data1", "read"},
353+
{"bob", "data2", "write"},
354+
};
355+
356+
testSyncedEnforcerGetPolicy(e, expected_policy);
357+
}
358+
359+
360+
337361
} // namespace

0 commit comments

Comments
 (0)