Browse Source

Support undefined permissions in PermissionManager.

pull/13644/head
Halil İbrahim Kalkan 4 years ago
parent
commit
8369764170
  1. 68
      modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs
  2. 6
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs
  3. 16
      modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs

68
modules/permission-management/src/Volo.Abp.PermissionManagement.Domain/Volo/Abp/PermissionManagement/PermissionManager.cs

@ -62,27 +62,57 @@ public class PermissionManager : IPermissionManager, ISingletonDependency
public virtual async Task<PermissionWithGrantedProviders> GetAsync(string permissionName, string providerName, string providerKey) public virtual async Task<PermissionWithGrantedProviders> GetAsync(string permissionName, string providerName, string providerKey)
{ {
var permission = await PermissionDefinitionManager.GetOrNullAsync(permissionName);
if (permission == null)
{
return new PermissionWithGrantedProviders(permissionName, false);
}
return await GetInternalAsync( return await GetInternalAsync(
await PermissionDefinitionManager.GetAsync(permissionName), permission,
providerName, providerName,
providerKey providerKey
); );
} }
public virtual async Task<MultiplePermissionWithGrantedProviders> GetAsync(string[] permissionNames, string providerName, string providerKey) public virtual async Task<MultiplePermissionWithGrantedProviders> GetAsync(
string[] permissionNames,
string providerName,
string providerKey)
{ {
var permissionDefinitions = new PermissionDefinition[permissionNames.Length]; var permissions = new List<PermissionDefinition>();
var undefinedPermissions = new List<string>();
foreach (var permissionName in permissionNames)
{
var permission = await PermissionDefinitionManager.GetOrNullAsync(permissionName);
if (permission != null)
{
permissions.Add(permission);
}
else
{
undefinedPermissions.Add(permissionName);
}
}
for (var i = 0; i < permissionNames.Length; i++) if (!permissions.Any())
{ {
permissionDefinitions[i] = await PermissionDefinitionManager.GetAsync(permissionNames[i]); return new MultiplePermissionWithGrantedProviders(undefinedPermissions.ToArray());
} }
return await GetInternalAsync( var result = await GetInternalAsync(
permissionDefinitions, permissions.ToArray(),
providerName, providerName,
providerKey providerKey
); );
foreach (var undefinedPermission in undefinedPermissions)
{
result.Result.Add(new PermissionWithGrantedProviders(undefinedPermission, false));
}
return result;
} }
public virtual async Task<List<PermissionWithGrantedProviders>> GetAllAsync(string providerName, string providerKey) public virtual async Task<List<PermissionWithGrantedProviders>> GetAllAsync(string providerName, string providerKey)
@ -97,7 +127,13 @@ public class PermissionManager : IPermissionManager, ISingletonDependency
public virtual async Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted) public virtual async Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted)
{ {
var permission = await PermissionDefinitionManager.GetAsync(permissionName); var permission = await PermissionDefinitionManager.GetOrNullAsync(permissionName);
if (permission == null)
{
/* Silently ignore undefined permissions,
maybe they were removed from dynamic permission definition store */
return;
}
if (!permission.IsEnabled || !await SimpleStateCheckerManager.IsEnabledAsync(permission)) if (!permission.IsEnabled || !await SimpleStateCheckerManager.IsEnabledAsync(permission))
{ {
@ -160,14 +196,24 @@ public class PermissionManager : IPermissionManager, ISingletonDependency
} }
} }
protected virtual async Task<PermissionWithGrantedProviders> GetInternalAsync(PermissionDefinition permission, string providerName, string providerKey) protected virtual async Task<PermissionWithGrantedProviders> GetInternalAsync(
PermissionDefinition permission,
string providerName,
string providerKey)
{ {
var multiplePermissionWithGrantedProviders = await GetInternalAsync(new PermissionDefinition[] { permission }, providerName, providerKey); var multiplePermissionWithGrantedProviders = await GetInternalAsync(
new[] { permission },
providerName,
providerKey
);
return multiplePermissionWithGrantedProviders.Result.First(); return multiplePermissionWithGrantedProviders.Result.First();
} }
protected virtual async Task<MultiplePermissionWithGrantedProviders> GetInternalAsync(PermissionDefinition[] permissions, string providerName, string providerKey) protected virtual async Task<MultiplePermissionWithGrantedProviders> GetInternalAsync(
PermissionDefinition[] permissions,
string providerName,
string providerKey)
{ {
var permissionNames = permissions.Select(x => x.Name).ToArray(); var permissionNames = permissions.Select(x => x.Name).ToArray();
var multiplePermissionWithGrantedProviders = new MultiplePermissionWithGrantedProviders(permissionNames); var multiplePermissionWithGrantedProviders = new MultiplePermissionWithGrantedProviders(permissionNames);

6
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionChecker_Basic_Tests.cs

@ -15,11 +15,9 @@ public class PermissionChecker_Basic_Tests : PermissionTestBase
} }
[Fact] [Fact]
public async Task Should_Throw_Exception_If_Permission_Is_Not_Defined() public async Task Should_Return_Prohibited_If_Permission_Is_Not_Defined()
{ {
await Assert.ThrowsAsync<AbpException>(async () => (await _permissionChecker.IsGrantedAsync("UndefinedPermissionName")).ShouldBeFalse();
await _permissionChecker.IsGrantedAsync("UndefinedPermissionName")
);
} }
[Fact] [Fact]

16
modules/permission-management/test/Volo.Abp.PermissionManagement.Domain.Tests/Volo/Abp/PermissionManagement/PermissionManager_Tests.cs

@ -72,12 +72,12 @@ public class PermissionManager_Tests : PermissionTestBase
} }
[Fact] [Fact]
public async Task Get_Should_Exception_When_Permission_Undefined() public async Task Get_Should_Return_Not_Granted_When_Permission_Undefined()
{ {
await Assert.ThrowsAsync<AbpException>(async () => await _permissionManager.GetAsync( var result = await _permissionManager.GetAsync("MyPermission1NotExist", "Test", "Test");
"MyPermission1NotExist", result.Name.ShouldBe("MyPermission1NotExist");
"Test", result.Providers.ShouldBeEmpty();
"Test")); result.IsGranted.ShouldBeFalse();
} }
[Fact] [Fact]
@ -126,13 +126,13 @@ public class PermissionManager_Tests : PermissionTestBase
} }
[Fact] [Fact]
public async Task Set_Should_Exception_When_Permission_Undefined() public async Task Set_Should_Silently_Ignore_When_Permission_Undefined()
{ {
await Assert.ThrowsAsync<AbpException>(async () => await _permissionManager.SetAsync( await _permissionManager.SetAsync(
"MyPermission1NotExist", "MyPermission1NotExist",
"Test", "Test",
"Test", "Test",
true)); true);
} }
[Fact] [Fact]

Loading…
Cancel
Save