diff --git a/Casbin.UnitTests/ModelTests/RbacApiTest.cs b/Casbin.UnitTests/ModelTests/RbacApiTest.cs index 32834db..036e224 100644 --- a/Casbin.UnitTests/ModelTests/RbacApiTest.cs +++ b/Casbin.UnitTests/ModelTests/RbacApiTest.cs @@ -423,8 +423,8 @@ public void TestGetImplicitPermissionsForUserWithDomain() TestGetImplicitPermissions(e, "alice", AsList( AsList("alice", "domain1", "data2", "read"), - AsList("role:reader", "domain1", "data1", "read"), - AsList("role:writer", "domain1", "data1", "write")), + AsList("role:writer", "domain1", "data1", "write"), + AsList("role:reader", "domain1", "data1", "read")), "domain1"); } diff --git a/Casbin.UnitTests/Util/TestUtil.cs b/Casbin.UnitTests/Util/TestUtil.cs index f19748d..7400a33 100644 --- a/Casbin.UnitTests/Util/TestUtil.cs +++ b/Casbin.UnitTests/Util/TestUtil.cs @@ -210,12 +210,11 @@ internal static void TestGetPermissions(IEnforcer e, string name, List> res, + internal static void TestGetImplicitPermissions(IEnforcer e, string name, List> except, string domain = null) { - IEnumerable> myRes = e.GetImplicitPermissionsForUser(name, domain); - string message = "Implicit permissions for " + name + ": " + myRes + ", supposed to be " + res; - Assert.True(res.DeepEquals(myRes), message); + IEnumerable> actual = e.GetImplicitPermissionsForUser(name, domain); + Assert.True(except.DeepEquals(actual)); } internal static void TestHasPermission(IEnforcer e, string name, List permission, bool res) diff --git a/Casbin/Rbac/Role.cs b/Casbin/Rbac/Role.cs index a159c46..798c55f 100644 --- a/Casbin/Rbac/Role.cs +++ b/Casbin/Rbac/Role.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -9,7 +10,7 @@ namespace Casbin.Rbac /// public class Role { - private readonly Lazy> _roles = new(); + private readonly Lazy> _roles = new(); public Role(string name) { @@ -28,17 +29,7 @@ public Role(string name, string domain) public void AddRole(Role role) { - if (_roles.IsValueCreated is false) - { - _roles.Value.Add(role.Name, role); - } - - if (_roles.Value.ContainsKey(role.Name)) - { - return; - } - - _roles.Value.Add(role.Name, role); + _roles.Value.TryAdd(role.Name, role); } public void DeleteRole(Role role) @@ -47,11 +38,7 @@ public void DeleteRole(Role role) { return; } - - if (_roles.Value.ContainsKey(role.Name)) - { - _roles.Value.Remove(role.Name); - } + _roles.Value.TryRemove(role.Name, out _); } public bool HasRole(string name, int hierarchyLevel, Func matchingFunc = null) @@ -71,7 +58,8 @@ public bool HasRole(string name, int hierarchyLevel, Func return false; } - return _roles.Value.Values.Any(role => role.HasRole(name, hierarchyLevel - 1)); + return _roles.Value.Values.Any(role => + role.HasRole(name, hierarchyLevel - 1)); } public bool HasDirectRole(string name, Func matchingFunc = null) @@ -86,7 +74,7 @@ public bool HasDirectRole(string name, Func matchingFunc = return _roles.Value.ContainsKey(name); } - + foreach (var role in _roles.Value.Values) { if (name == role.Name || matchingFunc(role.Name, name) && role.Name != name) @@ -101,10 +89,5 @@ public IEnumerable GetRoles() { return _roles.IsValueCreated ? _roles.Value.Keys : Enumerable.Empty(); } - - public override string ToString() - { - return $"{Name}{string.Join(",", _roles.Value)}"; - } } }