Skip to content

Commit f858d19

Browse files
committed
feat: Add GetImplicitUsersForPermission and AddRolesForUser.
Signed-off-by: DivyPatel9881 <[email protected]>
1 parent 3d27e01 commit f858d19

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

casbin/enforcer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,7 @@ class Enforcer : public IEnforcer{
214214
vector<string> GetUsersForRole(string name, vector<string> domain);
215215
bool HasRoleForUser(string name, string role);
216216
bool AddRoleForUser(string user, string role);
217+
bool AddRolesForUser(string user, vector<string> roles);
217218
bool AddPermissionForUser(string user, vector<string> permission);
218219
bool DeletePermissionForUser(string user, vector<string> permission);
219220
bool DeletePermissionsForUser(string user);

casbin/enforcer_interface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class IEnforcer {
6464
virtual vector<string> GetUsersForRole(string name, vector<string> domain) = 0;
6565
virtual bool HasRoleForUser(string name, string role) = 0;
6666
virtual bool AddRoleForUser(string user, string role) = 0;
67+
virtual bool AddRolesForUser(string user, vector<string> roles) = 0;
6768
virtual bool AddPermissionForUser(string user, vector<string> permission) = 0;
6869
virtual bool DeletePermissionForUser(string user, vector<string> permission) = 0;
6970
virtual bool DeletePermissionsForUser(string user) = 0;

casbin/rbac_api.cpp

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,18 @@ bool Enforcer :: AddRoleForUser(string user, string role) {
5757
return this->AddGroupingPolicy(params);
5858
}
5959

60+
// AddRolesForUser adds roles for a user.
61+
// Returns false if the user already has the roles (aka not affected).
62+
bool Enforcer :: AddRolesForUser(string user, vector<string> roles) {
63+
bool f = false;
64+
for(int i=0;i<roles.size();i++) {
65+
bool b = this->AddGroupingPolicy({user, roles[i]});
66+
if(b)
67+
f = true;
68+
}
69+
return f;
70+
}
71+
6072
// DeleteRoleForUser deletes a role for a user.
6173
// Returns false if the user does not have the role (aka not affected).
6274
bool Enforcer :: DeleteRoleForUser(string user, string role) {
@@ -210,24 +222,23 @@ vector<vector<string>> Enforcer :: GetImplicitPermissionsForUser(string user, ve
210222
// GetImplicitUsersForPermission("data1", "read") will get: ["alice", "bob"].
211223
// Note: only users will be returned, roles (2nd arg in "g") will be excluded.
212224
vector<string> Enforcer :: GetImplicitUsersForPermission(vector<string> permission) {
213-
vector<string> subjects = this->GetAllSubjects();
214-
vector<string> roles = this->GetAllRoles();
225+
vector<string> p_subjects = this->GetAllSubjects();
226+
vector<string> g_inherit = this->model->GetValuesForFieldInPolicyAllTypes("g", 1);
227+
vector<string> g_subjects = this->model->GetValuesForFieldInPolicyAllTypes("g", 0);
215228

216-
vector<string> users = SetSubtract(subjects, roles);
229+
vector<string> subjects(p_subjects);
230+
subjects.insert(subjects.end(), g_subjects.begin(), g_subjects.end());
231+
ArrayRemoveDuplicates(subjects);
217232

218233
vector<string> res;
219-
for (int i = 0 ; i < users.size() ; i++) {
220-
Scope scope = InitializeScope();
221-
PushObject(scope);
222-
PushStringPropToObject(scope, "r", users[i], "sub");
223-
PushStringPropToObject(scope, "r", permission[0], "obj");
224-
PushStringPropToObject(scope, "r", permission[1], "act");
225-
226-
bool allowed = this->Enforce(scope);
227-
228-
if (allowed)
229-
res.push_back(users[i]);
234+
for(int i=0;i<subjects.size();i++) {
235+
bool allowed = this->Enforce({subjects[i], permission[0], permission[1]});
236+
237+
if(allowed) {
238+
res.push_back(subjects[i]);
239+
}
230240
}
231241

242+
res = SetSubtract(res, g_inherit);
232243
return res;
233244
}

casbin/util/array_equals.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include "pch.h"
2020

21+
#include <algorithm>
22+
2123
#include "./util.h"
2224

2325
using namespace std;
@@ -28,6 +30,8 @@ bool ArrayEquals(vector<string> a, vector<string> b) {
2830
return false;
2931
}
3032

33+
sort(a.begin(), a.end());
34+
sort(b.begin(), b.end());
3135
for (int i = 0 ; i < a.size() ; i++) {
3236
if (a[i] != b[i]) {
3337
return false;

0 commit comments

Comments
 (0)