Added permission management

pull/301/head
Halil ibrahim Kalkan 7 years ago
parent 3638c7e77c
commit fd016c759c

@ -0,0 +1,2 @@
# abp-permissionmanagement
Permission management module for ABP framework.

@ -0,0 +1,102 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27428.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{B559B878-38F7-49CC-BC06-43A32D68C1A7}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{63DA4A89-5908-4F37-B7E6-525AEEF20C77}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Domain.Shared", "src\Volo.Abp.PermissionManagement.Domain.Shared\Volo.Abp.PermissionManagement.Domain.Shared.csproj", "{0B94EC37-84A7-487A-A764-335E81F3214B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Domain", "src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj", "{3D53B3FC-E6F1-4125-A502-1C5EFFAA1F10}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Application.Contracts", "src\Volo.Abp.PermissionManagement.Application.Contracts\Volo.Abp.PermissionManagement.Application.Contracts.csproj", "{A375FAF9-4D87-4C7C-8E42-6EF87FB89F33}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Application", "src\Volo.Abp.PermissionManagement.Application\Volo.Abp.PermissionManagement.Application.csproj", "{1B205C45-B5D7-4A75-9745-776A987E47F8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.EntityFrameworkCore", "src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj", "{0A6772C8-A77C-4E85-8380-4870534E552C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Web", "src\Volo.Abp.PermissionManagement.Web\Volo.Abp.PermissionManagement.Web.csproj", "{97A386F8-DAE0-4BEA-ADE5-1D57C3336515}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Abp.PermissionManagement.Tests", "test\Volo.Abp.PermissionManagement.Tests\Volo.Abp.PermissionManagement.Tests.csproj", "{48297098-79D0-413B-939C-6C432142C42D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.TestBase", "test\Volo.Abp.PermissionManagement.TestBase\Volo.Abp.PermissionManagement.TestBase.csproj", "{49259427-CAEB-4FAE-81E4-848F789487EA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests", "test\Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests\Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests.csproj", "{6E710DE0-F3B1-45D7-85BA-F39D839D9B65}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.MongoDB", "src\Volo.Abp.PermissionManagement.MongoDB\Volo.Abp.PermissionManagement.MongoDB.csproj", "{903C1729-CEBC-4BCD-A102-8D1B1B5465AF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.PermissionManagement.MongoDB.Tests", "test\Volo.Abp.PermissionManagement.MongoDB.Tests\Volo.Abp.PermissionManagement.MongoDB.Tests.csproj", "{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0B94EC37-84A7-487A-A764-335E81F3214B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0B94EC37-84A7-487A-A764-335E81F3214B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0B94EC37-84A7-487A-A764-335E81F3214B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0B94EC37-84A7-487A-A764-335E81F3214B}.Release|Any CPU.Build.0 = Release|Any CPU
{3D53B3FC-E6F1-4125-A502-1C5EFFAA1F10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D53B3FC-E6F1-4125-A502-1C5EFFAA1F10}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D53B3FC-E6F1-4125-A502-1C5EFFAA1F10}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D53B3FC-E6F1-4125-A502-1C5EFFAA1F10}.Release|Any CPU.Build.0 = Release|Any CPU
{A375FAF9-4D87-4C7C-8E42-6EF87FB89F33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A375FAF9-4D87-4C7C-8E42-6EF87FB89F33}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A375FAF9-4D87-4C7C-8E42-6EF87FB89F33}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A375FAF9-4D87-4C7C-8E42-6EF87FB89F33}.Release|Any CPU.Build.0 = Release|Any CPU
{1B205C45-B5D7-4A75-9745-776A987E47F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1B205C45-B5D7-4A75-9745-776A987E47F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1B205C45-B5D7-4A75-9745-776A987E47F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1B205C45-B5D7-4A75-9745-776A987E47F8}.Release|Any CPU.Build.0 = Release|Any CPU
{0A6772C8-A77C-4E85-8380-4870534E552C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0A6772C8-A77C-4E85-8380-4870534E552C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0A6772C8-A77C-4E85-8380-4870534E552C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0A6772C8-A77C-4E85-8380-4870534E552C}.Release|Any CPU.Build.0 = Release|Any CPU
{97A386F8-DAE0-4BEA-ADE5-1D57C3336515}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{97A386F8-DAE0-4BEA-ADE5-1D57C3336515}.Debug|Any CPU.Build.0 = Debug|Any CPU
{97A386F8-DAE0-4BEA-ADE5-1D57C3336515}.Release|Any CPU.ActiveCfg = Release|Any CPU
{97A386F8-DAE0-4BEA-ADE5-1D57C3336515}.Release|Any CPU.Build.0 = Release|Any CPU
{48297098-79D0-413B-939C-6C432142C42D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{48297098-79D0-413B-939C-6C432142C42D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{48297098-79D0-413B-939C-6C432142C42D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{48297098-79D0-413B-939C-6C432142C42D}.Release|Any CPU.Build.0 = Release|Any CPU
{49259427-CAEB-4FAE-81E4-848F789487EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49259427-CAEB-4FAE-81E4-848F789487EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49259427-CAEB-4FAE-81E4-848F789487EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49259427-CAEB-4FAE-81E4-848F789487EA}.Release|Any CPU.Build.0 = Release|Any CPU
{6E710DE0-F3B1-45D7-85BA-F39D839D9B65}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6E710DE0-F3B1-45D7-85BA-F39D839D9B65}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6E710DE0-F3B1-45D7-85BA-F39D839D9B65}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6E710DE0-F3B1-45D7-85BA-F39D839D9B65}.Release|Any CPU.Build.0 = Release|Any CPU
{903C1729-CEBC-4BCD-A102-8D1B1B5465AF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{903C1729-CEBC-4BCD-A102-8D1B1B5465AF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{903C1729-CEBC-4BCD-A102-8D1B1B5465AF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{903C1729-CEBC-4BCD-A102-8D1B1B5465AF}.Release|Any CPU.Build.0 = Release|Any CPU
{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{0B94EC37-84A7-487A-A764-335E81F3214B} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{3D53B3FC-E6F1-4125-A502-1C5EFFAA1F10} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{A375FAF9-4D87-4C7C-8E42-6EF87FB89F33} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{1B205C45-B5D7-4A75-9745-776A987E47F8} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{0A6772C8-A77C-4E85-8380-4870534E552C} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{97A386F8-DAE0-4BEA-ADE5-1D57C3336515} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{48297098-79D0-413B-939C-6C432142C42D} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77}
{49259427-CAEB-4FAE-81E4-848F789487EA} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77}
{6E710DE0-F3B1-45D7-85BA-F39D839D9B65} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77}
{903C1729-CEBC-4BCD-A102-8D1B1B5465AF} = {B559B878-38F7-49CC-BC06-43A32D68C1A7}
{AFA65E08-1F17-4BBE-96A6-80F3CFE22A75} = {63DA4A89-5908-4F37-B7E6-525AEEF20C77}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8FC7DF78-5E2D-489F-9D43-147D2ABAA112}
EndGlobalSection
EndGlobal

@ -0,0 +1,16 @@
<Project>
<PropertyGroup>
<LangVersion>latest</LangVersion>
<Version>0.3.0</Version>
<NoWarn>$(NoWarn);CS1591</NoWarn>
<PackageIconUrl>http://www.aspnetboilerplate.com/images/abp_nupkg.png</PackageIconUrl>
<PackageProjectUrl>http://abp.io</PackageProjectUrl>
<RepositoryType>git</RepositoryType>
<RepositoryUrl>https://github.com/volosoft/abp/</RepositoryUrl>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SourceLink.Create.CommandLine" Version="2.8.1" PrivateAssets="All" />
</ItemGroup>
</Project>

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.Application.Contracts</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.Application.Contracts</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Domain.Shared\Volo.Abp.PermissionManagement.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Authorization\Volo.Abp.Authorization.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Ddd.Application\Volo.Abp.Ddd.Application.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,16 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Application;
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement
{
[DependsOn(typeof(AbpDddApplicationModule))]
[DependsOn(typeof(AbpPermissionManagementDomainSharedModule))]
public class AbpPermissionManagementApplicationContractsModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpPermissionManagementApplicationContractsModule>();
}
}
}

@ -0,0 +1,11 @@
using System.Collections.Generic;
namespace Volo.Abp.PermissionManagement
{
public class GetPermissionListResultDto
{
public string EntityDisplayName { get; set; }
public List<PermissionGroupDto> Groups { get; set; }
}
}

@ -0,0 +1,17 @@
using System.Collections.Generic;
namespace Volo.Abp.PermissionManagement
{
public class PermissionGrantInfoDto
{
public string Name { get; set; }
public string DisplayName { get; set; }
public string ParentName { get; set; }
public bool IsGranted { get; set; }
public List<ProviderInfoDto> Providers { get; set; }
}
}

@ -0,0 +1,13 @@
using System.Collections.Generic;
namespace Volo.Abp.PermissionManagement
{
public class PermissionGroupDto
{
public string Name { get; set; }
public string DisplayName { get; set; }
public List<PermissionGrantInfoDto> Permissions { get; set; }
}
}

@ -0,0 +1,9 @@
namespace Volo.Abp.PermissionManagement
{
public class ProviderInfoDto
{
public string ProviderName { get; set; }
public string ProviderKey { get; set; }
}
}

@ -0,0 +1,9 @@
namespace Volo.Abp.PermissionManagement
{
public class UpdatePermissionDto
{
public string Name { get; set; }
public bool IsGranted { get; set; }
}
}

@ -0,0 +1,7 @@
namespace Volo.Abp.PermissionManagement
{
public class UpdatePermissionsDto
{
public UpdatePermissionDto[] Permissions { get; set; }
}
}

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.Application</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.Application</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Application.Contracts\Volo.Abp.PermissionManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,15 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement
{
[DependsOn(typeof(AbpPermissionManagementDomainModule))]
[DependsOn(typeof(AbpPermissionManagementApplicationContractsModule))]
public class AbpPermissionManagementApplicationModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpPermissionManagementApplicationModule>();
}
}
}

@ -0,0 +1,12 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.PermissionManagement
{
public interface IPermissionAppServiceHelper
{
Task<GetPermissionListResultDto> GetAsync([NotNull] string providerName, [NotNull] string providerKey);
Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdatePermissionsDto input);
}
}

@ -0,0 +1,82 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Localization;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.PermissionManagement
{
public class PermissionAppServiceHelper : IPermissionAppServiceHelper, ITransientDependency
{
private readonly IPermissionManager _permissionManager;
private readonly IPermissionDefinitionManager _permissionDefinitionManager;
private readonly IStringLocalizerFactory _stringLocalizerFactory;
public PermissionAppServiceHelper(
IPermissionManager permissionManager,
IPermissionDefinitionManager permissionDefinitionManager,
IStringLocalizerFactory stringLocalizerFactory)
{
_permissionManager = permissionManager;
_permissionDefinitionManager = permissionDefinitionManager;
_stringLocalizerFactory = stringLocalizerFactory;
}
public async Task<GetPermissionListResultDto> GetAsync(string providerName, string providerKey)
{
var result = new GetPermissionListResultDto
{
EntityDisplayName = providerKey,
Groups = new List<PermissionGroupDto>()
};
foreach (var group in _permissionDefinitionManager.GetGroups())
{
var groupDto = new PermissionGroupDto
{
Name = group.Name,
DisplayName = group.DisplayName.Localize(_stringLocalizerFactory),
Permissions = new List<PermissionGrantInfoDto>()
};
foreach (var permission in group.GetPermissionsWithChildren())
{
var grantInfoDto = new PermissionGrantInfoDto
{
Name = permission.Name,
DisplayName = permission.DisplayName.Localize(_stringLocalizerFactory),
ParentName = permission.Parent?.Name,
Providers = new List<ProviderInfoDto>()
};
var grantInfo = await _permissionManager.GetAsync(permission.Name, providerName, providerKey);
grantInfoDto.IsGranted = grantInfo.IsGranted;
foreach (var provider in grantInfo.Providers)
{
grantInfoDto.Providers.Add(new ProviderInfoDto
{
ProviderName = provider.Name,
ProviderKey = provider.Key,
});
}
groupDto.Permissions.Add(grantInfoDto);
}
result.Groups.Add(groupDto);
}
return result;
}
public async Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input)
{
foreach (var permission in input.Permissions)
{
await _permissionManager.SetAsync(permission.Name, providerName, providerKey, permission.IsGranted);
}
}
}
}

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.Domain.Shared</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.Domain.Shared</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Core\Volo.Abp.Core.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,13 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement
{
public class AbpPermissionManagementDomainSharedModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpPermissionManagementDomainSharedModule>();
}
}
}

@ -0,0 +1,11 @@
namespace Volo.Abp.PermissionManagement
{
public static class PermissionGrantConsts
{
public const int MaxNameLength = 128;
public const int MaxProviderNameLength = 64;
public const int MaxProviderKeyLength = 64;
}
}

@ -0,0 +1,25 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.Domain</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.Domain</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Domain.Shared\Volo.Abp.PermissionManagement.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Authorization\Volo.Abp.Authorization.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Caching\Volo.Abp.Caching.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Ddd.Domain\Volo.Abp.Ddd.Domain.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Json\Volo.Abp.Json.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,9 @@
namespace Volo.Abp.PermissionManagement
{
public static class AbpPermissionManagementConsts
{
public const string DefaultDbTablePrefix = "Abp";
public const string DefaultDbSchema = null;
}
}

@ -0,0 +1,22 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Authorization;
using Volo.Abp.Caching;
using Volo.Abp.Domain;
using Volo.Abp.Json;
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement
{
[DependsOn(typeof(AbpAuthorizationModule))]
[DependsOn(typeof(AbpDddDomainModule))]
[DependsOn(typeof(AbpPermissionManagementDomainSharedModule))]
[DependsOn(typeof(AbpCachingModule))]
[DependsOn(typeof(AbpJsonModule))]
public class AbpPermissionManagementDomainModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpPermissionManagementDomainModule>();
}
}
}

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace Volo.Abp.PermissionManagement
{
public interface IPermissionGrantRepository : IBasicRepository<PermissionGrant, Guid>
{
Task<PermissionGrant> FindAsync(string name, string providerName, string providerKey);
Task<List<PermissionGrant>> GetListAsync(string providerName, string providerKey);
}
}

@ -0,0 +1,16 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.PermissionManagement
{
public interface IPermissionManagementProvider : ISingletonDependency
{
string Name { get; }
Task<PermissionValueProviderGrantInfo> CheckAsync([NotNull] string name, [NotNull] string providerName, [NotNull] string providerKey);
Task SetAsync([NotNull] string name, [NotNull] string providerKey, bool isGranted);
}
}

@ -0,0 +1,17 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.PermissionManagement
{
//TODO: Write extension methods for simple IsGranted check
public interface IPermissionManager
{
Task<PermissionWithGrantedProviders> GetAsync(string permissionName, string providerName, string providerKey);
Task<List<PermissionWithGrantedProviders>> GetAllAsync([NotNull] string providerName, [NotNull] string providerKey);
Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted);
}
}

@ -0,0 +1,42 @@
using System;
using JetBrains.Annotations;
using Volo.Abp.Domain.Entities;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.PermissionManagement
{
public class PermissionGrant : Entity<Guid>, IMultiTenant
{
public virtual Guid? TenantId { get; protected set; }
[NotNull]
public virtual string Name { get; protected set; }
[NotNull]
public virtual string ProviderName { get; protected set; }
[NotNull]
public virtual string ProviderKey { get; protected set; }
protected PermissionGrant()
{
}
public PermissionGrant(
Guid id,
[NotNull] string name,
[NotNull] string providerName ,
[NotNull] string providerKey,
Guid? tenantId = null)
{
Check.NotNull(name, nameof(name));
Id = id;
Name = name;
ProviderName = providerName;
ProviderKey = providerKey;
TenantId = tenantId;
}
}
}

@ -0,0 +1,28 @@
using System;
namespace Volo.Abp.PermissionManagement
{
[Serializable]
public class PermissionGrantCacheItem
{
public string Name { get; set; }
public bool IsGranted { get; set; }
public PermissionGrantCacheItem()
{
}
public PermissionGrantCacheItem(string name, bool isGranted)
{
Name = name;
IsGranted = isGranted;
}
public static string CalculateCacheKey(string name, string providerName, string providerKey)
{
return "pn:" + providerName + ",pk:" + providerKey + ",n:" + name;
}
}
}

@ -0,0 +1,41 @@
using System.Threading.Tasks;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.EventBus;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.PermissionManagement
{
public class PermissionGrantCacheItemInvalidator : IEventHandler<EntityChangedEventData<PermissionGrant>>, ITransientDependency
{
protected ICurrentTenant CurrentTenant { get; }
protected IDistributedCache<PermissionGrantCacheItem> Cache { get; }
public PermissionGrantCacheItemInvalidator(IDistributedCache<PermissionGrantCacheItem> cache, ICurrentTenant currentTenant)
{
Cache = cache;
CurrentTenant = currentTenant;
}
public virtual async Task HandleEventAsync(EntityChangedEventData<PermissionGrant> eventData)
{
var cacheKey = CalculateCacheKey(
eventData.Entity.Name,
eventData.Entity.ProviderName,
eventData.Entity.ProviderKey
);
using (CurrentTenant.Change(eventData.Entity.TenantId))
{
await Cache.RemoveAsync(cacheKey);
}
}
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)
{
return PermissionGrantCacheItem.CalculateCacheKey(name, providerName, providerKey);
}
}
}

@ -0,0 +1,14 @@
using Volo.Abp.Collections;
namespace Volo.Abp.PermissionManagement
{
public class PermissionManagementOptions
{
public ITypeList<IPermissionManagementProvider> ManagementProviders { get; }
public PermissionManagementOptions()
{
ManagementProviders = new TypeList<IPermissionManagementProvider>();
}
}
}

@ -0,0 +1,79 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.PermissionManagement
{
public abstract class PermissionManagementProvider : IPermissionManagementProvider
{
public abstract string Name { get; }
protected IPermissionGrantRepository PermissionGrantRepository { get; }
protected IGuidGenerator GuidGenerator { get; }
protected ICurrentTenant CurrentTenant { get; }
protected PermissionManagementProvider(
IPermissionGrantRepository permissionGrantRepository,
IGuidGenerator guidGenerator,
ICurrentTenant currentTenant)
{
PermissionGrantRepository = permissionGrantRepository;
GuidGenerator = guidGenerator;
CurrentTenant = currentTenant;
}
public virtual async Task<PermissionValueProviderGrantInfo> CheckAsync(string name, string providerName, string providerKey)
{
if (providerName != Name)
{
return PermissionValueProviderGrantInfo.NonGranted;
}
return new PermissionValueProviderGrantInfo(
await PermissionGrantRepository.FindAsync(name, providerName, providerKey) != null,
providerKey
);
}
public virtual Task SetAsync(string name, string providerKey, bool isGranted)
{
return isGranted
? GrantAsync(name, providerKey)
: RevokeAsync(name, providerKey);
}
protected virtual async Task GrantAsync(string name, string providerKey)
{
var permissionGrant = await PermissionGrantRepository.FindAsync(name, Name, providerKey);
if (permissionGrant != null)
{
return;
}
await PermissionGrantRepository.InsertAsync(
new PermissionGrant(
GuidGenerator.Create(),
name,
Name,
providerKey,
CurrentTenant.Id
)
);
}
protected virtual async Task RevokeAsync(string name, string providerKey)
{
var permissionGrant = await PermissionGrantRepository.FindAsync(name, Name, providerKey);
if (permissionGrant == null)
{
return;
}
await PermissionGrantRepository.DeleteAsync(permissionGrant);
}
}
}

@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
namespace Volo.Abp.PermissionManagement
{
public class PermissionManager : IPermissionManager, ISingletonDependency
{
protected IPermissionGrantRepository PermissionGrantRepository { get; }
protected IPermissionDefinitionManager PermissionDefinitionManager { get; }
protected IGuidGenerator GuidGenerator { get; }
protected IReadOnlyList<IPermissionManagementProvider> ManagementProviders => _lazyProviders.Value;
protected PermissionManagementOptions Options { get; }
private readonly Lazy<List<IPermissionManagementProvider>> _lazyProviders;
public PermissionManager(
IPermissionDefinitionManager permissionDefinitionManager,
IPermissionGrantRepository permissionGrantRepository,
IServiceProvider serviceProvider,
IGuidGenerator guidGenerator,
IOptions<PermissionManagementOptions> options)
{
GuidGenerator = guidGenerator;
PermissionGrantRepository = permissionGrantRepository;
PermissionDefinitionManager = permissionDefinitionManager;
Options = options.Value;
_lazyProviders = new Lazy<List<IPermissionManagementProvider>>(
() => Options
.ManagementProviders
.Select(c => serviceProvider.GetRequiredService(c) as IPermissionManagementProvider)
.ToList(),
true
);
}
public async Task<PermissionWithGrantedProviders> GetAsync(string permissionName, string providerName, string providerKey)
{
return await GetInternalAsync(PermissionDefinitionManager.Get(permissionName), providerName, providerKey);
}
public async Task<List<PermissionWithGrantedProviders>> GetAllAsync(string providerName, string providerKey)
{
var results = new List<PermissionWithGrantedProviders>();
foreach (var permissionDefinition in PermissionDefinitionManager.GetPermissions())
{
results.Add(await GetInternalAsync(permissionDefinition, providerName, providerKey));
}
return results;
}
public async Task SetAsync(string permissionName, string providerName, string providerKey, bool isGranted)
{
var currentGrantInfo = await GetAsync(permissionName, providerName, providerKey);
if (currentGrantInfo.IsGranted == isGranted)
{
return;
}
var provider = ManagementProviders.FirstOrDefault(m => m.Name == providerName);
if (provider == null)
{
throw new AbpException("Unknown permission management provider: " + providerName);
}
await provider.SetAsync(permissionName, providerKey, isGranted);
}
protected virtual async Task<PermissionWithGrantedProviders> GetInternalAsync(PermissionDefinition permissionDefinition, string providerName, string providerKey)
{
var result = new PermissionWithGrantedProviders(permissionDefinition.Name, false);
foreach (var provider in ManagementProviders)
{
var providerResult = await provider.CheckAsync(permissionDefinition.Name, providerName, providerKey);
if (providerResult.IsGranted)
{
result.IsGranted = true;
result.Providers.Add(new PermissionValueProviderInfo(provider.Name, providerResult.ProviderKey));
}
}
return result;
}
}
}

@ -0,0 +1,55 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.PermissionManagement
{
public class PermissionStore : IPermissionStore, ITransientDependency
{
protected IPermissionGrantRepository PermissionGrantRepository { get; }
protected IDistributedCache<PermissionGrantCacheItem> Cache { get; }
public PermissionStore(
IPermissionGrantRepository permissionGrantRepository,
IDistributedCache<PermissionGrantCacheItem> cache)
{
PermissionGrantRepository = permissionGrantRepository;
Cache = cache;
}
public async Task<bool> IsGrantedAsync(string name, string providerName, string providerKey)
{
return (await GetCacheItemAsync(name, providerName, providerKey)).IsGranted;
}
protected virtual async Task<PermissionGrantCacheItem> GetCacheItemAsync(string name, string providerName, string providerKey)
{
var cacheKey = CalculateCacheKey(name, providerName, providerKey);
var cacheItem = await Cache.GetAsync(cacheKey);
if (cacheItem != null)
{
return cacheItem;
}
cacheItem = new PermissionGrantCacheItem(
name,
await PermissionGrantRepository.FindAsync(name, providerName, providerKey) != null
);
await Cache.SetAsync(
cacheKey,
cacheItem
);
return cacheItem;
}
protected virtual string CalculateCacheKey(string name, string providerName, string providerKey)
{
return PermissionGrantCacheItem.CalculateCacheKey(name, providerName, providerKey);
}
}
}

@ -0,0 +1,20 @@
using JetBrains.Annotations;
namespace Volo.Abp.PermissionManagement
{
public class PermissionValueProviderInfo
{
public string Name { get; }
public string Key { get; }
public PermissionValueProviderInfo([NotNull]string name, [NotNull]string key)
{
Check.NotNull(name, nameof(name));
Check.NotNull(key, nameof(key));
Name = name;
Key = key;
}
}
}

@ -0,0 +1,24 @@
using System.Collections.Generic;
using JetBrains.Annotations;
namespace Volo.Abp.PermissionManagement
{
public class PermissionWithGrantedProviders
{
public string Name { get; }
public bool IsGranted { get; set; }
public List<PermissionValueProviderInfo> Providers { get; set; }
public PermissionWithGrantedProviders([NotNull] string name, bool isGranted)
{
Check.NotNull(name, nameof(name));
Name = name;
IsGranted = isGranted;
Providers = new List<PermissionValueProviderInfo>();
}
}
}

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.EntityFrameworkCore</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.EntityFrameworkCore</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.EntityFrameworkCore\Volo.Abp.EntityFrameworkCore.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,32 @@
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore;
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
public static class AbpPermissionManagementDbContextModelBuilderExtensions
{
public static void ConfigurePermissionManagement(
[NotNull] this ModelBuilder builder,
[CanBeNull] string tablePrefix = AbpPermissionManagementConsts.DefaultDbTablePrefix,
[CanBeNull] string schema = AbpPermissionManagementConsts.DefaultDbSchema)
{
Check.NotNull(builder, nameof(builder));
if (tablePrefix == null)
{
tablePrefix = "";
}
builder.Entity<PermissionGrant>(b =>
{
b.ToTable(tablePrefix + "PermissionGrants", schema);
b.Property(x => x.Name).HasMaxLength(PermissionGrantConsts.MaxNameLength).IsRequired();
b.Property(x => x.ProviderName).HasMaxLength(PermissionGrantConsts.MaxProviderNameLength).IsRequired();
b.Property(x => x.ProviderKey).HasMaxLength(PermissionGrantConsts.MaxProviderKeyLength).IsRequired();
b.HasIndex(x => new {x.Name, x.ProviderName, x.ProviderKey});
});
}
}
}

@ -0,0 +1,23 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
[DependsOn(typeof(AbpPermissionManagementDomainModule))]
[DependsOn(typeof(AbpEntityFrameworkCoreModule))]
public class AbpPermissionManagementEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddAbpDbContext<PermissionManagementDbContext>(options =>
{
options.AddDefaultRepositories<IPermissionManagementDbContext>();
options.AddRepository<PermissionGrant, EfCorePermissionGrantRepository>();
});
services.AddAssemblyOf<AbpPermissionManagementEntityFrameworkCoreModule>();
}
}
}

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
public class EfCorePermissionGrantRepository : EfCoreRepository<IPermissionManagementDbContext, PermissionGrant, Guid>, IPermissionGrantRepository
{
public EfCorePermissionGrantRepository(IDbContextProvider<IPermissionManagementDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async Task<PermissionGrant> FindAsync(string name, string providerName, string providerKey)
{
return await DbSet
.FirstOrDefaultAsync(s =>
s.Name == name &&
s.ProviderName == providerName &&
s.ProviderKey == providerKey
);
}
public async Task<List<PermissionGrant>> GetListAsync(string providerName, string providerKey)
{
return await DbSet
.Where(s =>
s.ProviderName == providerName &&
s.ProviderKey == providerKey
).ToListAsync();
}
}
}

@ -0,0 +1,12 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
[ConnectionStringName("AbpPermissionManagement")]
public interface IPermissionManagementDbContext : IEfCoreDbContext
{
DbSet<PermissionGrant> PermissionGrants { get; set; }
}
}

@ -0,0 +1,29 @@
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
[ConnectionStringName("AbpPermissionManagement")]
public class PermissionManagementDbContext : AbpDbContext<PermissionManagementDbContext>, IPermissionManagementDbContext
{
public static string TablePrefix { get; set; } = AbpPermissionManagementConsts.DefaultDbTablePrefix;
public static string Schema { get; set; } = AbpPermissionManagementConsts.DefaultDbSchema;
public DbSet<PermissionGrant> PermissionGrants { get; set; }
public PermissionManagementDbContext(DbContextOptions<PermissionManagementDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.ConfigurePermissionManagement(TablePrefix, Schema);
}
}
}

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.MongoDB</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.MongoDB</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.MongoDB\Volo.Abp.MongoDB.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,21 @@
using MongoDB.Bson.Serialization;
using Volo.Abp.Threading;
namespace Volo.Abp.PermissionManagement.MongoDB
{
public static class AbpPermissionManagementBsonClassMap
{
private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();
public static void Configure()
{
OneTimeRunner.Run(() =>
{
BsonClassMap.RegisterClassMap<PermissionGrant>(map =>
{
map.AutoMap();
});
});
}
}
}

@ -0,0 +1,24 @@
using System;
using Volo.Abp.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDB
{
public static class AbpPermissionManagementMongoDbContextExtensions
{
public static void ConfigurePermissionManagement(
this IMongoModelBuilder builder,
Action<MongoModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new PermissionManagementMongoModelBuilderConfigurationOptions();
optionsAction?.Invoke(options);
builder.Entity<PermissionGrant>(b =>
{
b.CollectionName = options.CollectionPrefix + "PermissionGrants";
});
}
}
}

@ -0,0 +1,28 @@
using Microsoft.Extensions.DependencyInjection;
using MongoDB.Driver;
using Volo.Abp.Modularity;
using Volo.Abp.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDB
{
[DependsOn(
typeof(AbpPermissionManagementDomainModule),
typeof(AbpMongoDbModule)
)]
public class AbpPermissionManagementMongoDbModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
AbpPermissionManagementBsonClassMap.Configure();
services.AddMongoDbContext<PermissionManagementMongoDbContext>(options =>
{
options.AddDefaultRepositories<IPermissionManagementMongoDbContext>();
options.AddRepository<PermissionGrant, MongoPermissionGrantRepository>();
});
services.AddAssemblyOf<AbpPermissionManagementMongoDbModule>();
}
}
}

@ -0,0 +1,12 @@
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDB
{
[ConnectionStringName("AbpPermissionManagement")]
public interface IPermissionManagementMongoDbContext : IAbpMongoDbContext
{
IMongoCollection<PermissionGrant> PermissionGrants { get; }
}
}

@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using Volo.Abp.Domain.Repositories.MongoDB;
using Volo.Abp.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDB
{
public class MongoPermissionGrantRepository : MongoDbRepository<IPermissionManagementMongoDbContext, PermissionGrant, Guid>, IPermissionGrantRepository
{
public MongoPermissionGrantRepository(IMongoDbContextProvider<IPermissionManagementMongoDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public async Task<PermissionGrant> FindAsync(string name, string providerName, string providerKey)
{
return await GetMongoQueryable()
.FirstOrDefaultAsync(s =>
s.Name == name &&
s.ProviderName == providerName &&
s.ProviderKey == providerKey
);
}
public async Task<List<PermissionGrant>> GetListAsync(string providerName, string providerKey)
{
return await GetMongoQueryable()
.Where(s =>
s.ProviderName == providerName &&
s.ProviderKey == providerKey
).ToListAsync();
}
}
}

@ -0,0 +1,24 @@
using MongoDB.Driver;
using Volo.Abp.Data;
using Volo.Abp.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDB
{
[ConnectionStringName("AbpPermissionManagement")]
public class PermissionManagementMongoDbContext : AbpMongoDbContext, IPermissionManagementMongoDbContext
{
public static string CollectionPrefix { get; set; } = AbpPermissionManagementConsts.DefaultDbTablePrefix;
public IMongoCollection<PermissionGrant> PermissionGrants => Collection<PermissionGrant>();
protected override void CreateModel(IMongoModelBuilder modelBuilder)
{
base.CreateModel(modelBuilder);
modelBuilder.ConfigurePermissionManagement(options =>
{
options.CollectionPrefix = CollectionPrefix;
});
}
}
}

@ -0,0 +1,13 @@
using JetBrains.Annotations;
using Volo.Abp.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDB
{
public class PermissionManagementMongoModelBuilderConfigurationOptions : MongoModelBuilderConfigurationOptions
{
public PermissionManagementMongoModelBuilderConfigurationOptions([NotNull] string tablePrefix = AbpPermissionManagementConsts.DefaultDbTablePrefix)
: base(tablePrefix)
{
}
}
}

@ -0,0 +1,18 @@
using AutoMapper;
using Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement;
namespace Volo.Abp.PermissionManagement.Web
{
public class AbpPermissionManagementWebAutoMapperProfile : Profile
{
public AbpPermissionManagementWebAutoMapperProfile()
{
CreateMap<PermissionGroupDto, PermissionManagementModal.PermissionGroupViewModel>();
CreateMap<PermissionGrantInfoDto, PermissionManagementModal.PermissionGrantInfoViewModel>()
.ForMember(p => p.Depth, opts => opts.Ignore());
CreateMap<ProviderInfoDto, PermissionManagementModal.ProviderInfoViewModel>();
}
}
}

@ -0,0 +1,47 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap;
using Volo.Abp.AutoMapper;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.Web.Localization.Resources.AbpPermissionManagement;
using Volo.Abp.VirtualFileSystem;
namespace Volo.Abp.PermissionManagement.Web
{
[DependsOn(typeof(AbpPermissionManagementApplicationContractsModule))]
[DependsOn(typeof(AbpAspNetCoreMvcUiBootstrapModule))]
[DependsOn(typeof(AbpAutoMapperModule))]
public class AbpPermissionManagementWebModule : AbpModule
{
public override void PreConfigureServices(IServiceCollection services)
{
services.PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
options.AddAssemblyResource(typeof(AbpPermissionManagementResource));
});
}
public override void ConfigureServices(IServiceCollection services)
{
services.AddAssemblyOf<AbpPermissionManagementWebModule>();
services.Configure<VirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<AbpPermissionManagementWebModule>("Volo.Abp.PermissionManagement.Web");
});
services.Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Add<AbpPermissionManagementResource>("en")
.AddVirtualJson("/Localization/Resources/AbpPermissionManagement");
});
services.Configure<AbpAutoMapperOptions>(options =>
{
options.AddProfile<AbpPermissionManagementWebAutoMapperProfile>(validate: true);
});
}
}
}

@ -0,0 +1,15 @@
using Localization.Resources.AbpUi;
using Volo.Abp.Localization;
using Volo.Abp.Localization.Resources.AbpValidation;
namespace Volo.Abp.PermissionManagement.Web.Localization.Resources.AbpPermissionManagement
{
[InheritResource(
typeof(AbpValidationResource),
typeof(AbpUiResource))]
[LocalizationResourceName("AbpPermissionManagement")]
public class AbpPermissionManagementResource
{
}
}

@ -0,0 +1,12 @@
using System.Threading.Tasks;
using JetBrains.Annotations;
namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement
{
public interface IPermissionAppServiceGateway
{
Task<GetPermissionListResultDto> GetAsync([NotNull] string providerName, [NotNull] string providerKey);
Task UpdateAsync([NotNull] string providerName, [NotNull] string providerKey, UpdatePermissionsDto input);
}
}

@ -0,0 +1,18 @@
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement
{
public class NotImplementedPermissionAppServiceGateway : IPermissionAppServiceGateway, ISingletonDependency
{
public Task<GetPermissionListResultDto> GetAsync(string providerName, string providerKey)
{
throw new System.NotImplementedException();
}
public Task UpdateAsync(string providerName, string providerKey, UpdatePermissionsDto input)
{
throw new System.NotImplementedException();
}
}
}

@ -0,0 +1,58 @@
@page
@using Microsoft.AspNetCore.Mvc.Localization
@using Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Modal
@using Volo.Abp.PermissionManagement.Web.Localization.Resources.AbpPermissionManagement
@using Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement
@model PermissionManagementModal
@inject IHtmlLocalizer<AbpPermissionManagementResource> L
@{
Layout = null;
}
<form method="post" asp-page="/AbpPermissionManagement/PermissionManagementModal" data-script-class="abp.modals.PermissionManagement">
<abp-modal size="Large">
<abp-modal-header title="@(L["Permissions"].Value) - @Model.EntityDisplayName"></abp-modal-header>
<abp-modal-body>
<input asp-for="@Model.ProviderKey" />
<input asp-for="@Model.ProviderName" />
<abp-row>
<abp-column size-sm="_4">
<div class="nav flex-column nav-pills" id="v-pills-tab" role="tablist" aria-orientation="vertical">
@for (var i = 0; i < Model.Groups.Count; i++)
{
<a class="nav-link @(i == 0 ? "active" : "")" id="v-pills-tab-@Model.Groups[i].GetNormalizedGroupName()" data-toggle="pill" href="#v-pills-@Model.Groups[i].GetNormalizedGroupName()" role="tab" aria-controls="v-pills-@Model.Groups[i].GetNormalizedGroupName()" aria-selected="false">@Model.Groups[i].DisplayName</a>
}
</div>
</abp-column>
<abp-column size-sm="_8">
<div class="tab-content" id="v-pills-tabContent">
@for (var i = 0; i < Model.Groups.Count; i++)
{
<div class="tab-pane fade @(i == 0 ? "show active" : "")" id="v-pills-@Model.Groups[i].GetNormalizedGroupName()" role="tabpanel" aria-labelledby="v-pills-tab-@Model.Groups[i].GetNormalizedGroupName()">
@for (var j = 0; j < Model.Groups[i].Permissions.Count; j++)
{
<abp-input asp-for="@Model.Groups[i].Permissions[j].IsGranted"
label="@Model.Groups[i].Permissions[j].GetShownName(Model.ProviderName)"
disabled="@Model.Groups[i].Permissions[j].IsDisabled(Model.ProviderName)"
data-permission-name="@Model.Groups[i].Permissions[j].Name"
data-parent-name="@(Model.Groups[i].Permissions[j].ParentName ?? "")"
style="margin-left: @(Model.Groups[i].Permissions[j].Depth * 20)px" />
<input asp-for="@Model.Groups[i].Permissions[j].Name" />
}
</div>
}
</div>
</abp-column>
</abp-row>
</abp-modal-body>
<abp-modal-footer buttons="@(AbpModalButtons.Cancel|AbpModalButtons.Save)"></abp-modal-footer>
</abp-modal>
</form>

@ -0,0 +1,139 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages;
using Volo.Abp.PermissionManagement.Web.Utils;
namespace Volo.Abp.PermissionManagement.Web.Pages.AbpPermissionManagement
{
public class PermissionManagementModal : AbpPageModel
{
private readonly IPermissionAppServiceGateway _permissionAppServiceGateway;
[Required]
[HiddenInput]
[BindProperty(SupportsGet = true)]
public string ProviderName { get; set; }
[Required]
[HiddenInput]
[BindProperty(SupportsGet = true)]
public string ProviderKey { get; set; }
[BindProperty]
public List<PermissionGroupViewModel> Groups { get; set; }
public string EntityDisplayName { get; set; }
public PermissionManagementModal(IPermissionAppServiceGateway permissionAppServiceGateway)
{
_permissionAppServiceGateway = permissionAppServiceGateway;
}
public async Task OnGetAsync()
{
ValidateModel();
var result = await _permissionAppServiceGateway.GetAsync(ProviderName, ProviderKey);
EntityDisplayName = result.EntityDisplayName;
Groups = ObjectMapper
.Map<List<PermissionGroupDto>, List<PermissionGroupViewModel>>(result.Groups)
.OrderBy(g => g.DisplayName)
.ToList();
foreach (var group in Groups)
{
new FlatTreeDepthFinder<PermissionGrantInfoViewModel>().SetDepths(group.Permissions);
}
}
public async Task<IActionResult> OnPostAsync()
{
ValidateModel();
var updatePermissionDtos = Groups
.SelectMany(g => g.Permissions)
.Select(p => new UpdatePermissionDto
{
Name = p.Name,
IsGranted = p.IsGranted
})
.ToArray();
await _permissionAppServiceGateway.UpdateAsync(
ProviderName,
ProviderKey,
new UpdatePermissionsDto
{
Permissions = updatePermissionDtos
}
);
return NoContent();
}
public class PermissionGroupViewModel
{
public string Name { get; set; }
public string DisplayName { get; set; }
public List<PermissionGrantInfoViewModel> Permissions { get; set; }
public string GetNormalizedGroupName()
{
return Name.Replace(".", "_");
}
}
public class PermissionGrantInfoViewModel : IFlatTreeItem
{
[Required]
[HiddenInput]
public string Name { get; set; }
public string DisplayName { get; set; }
public int Depth { get; set; }
public string ParentName { get; set; }
public bool IsGranted { get; set; }
public List<ProviderInfoViewModel> Providers { get; set; }
public bool IsDisabled(string currentProviderName)
{
return IsGranted && Providers.All(p => p.ProviderName != currentProviderName);
}
public string GetShownName(string currentProviderName)
{
if (!IsDisabled(currentProviderName))
{
return DisplayName;
}
return string.Format(
"{0} <span class=\"text-muted\">({1})</span>",
DisplayName,
Providers
.Where(p => p.ProviderName != currentProviderName)
.Select(p => p.ProviderName)
.JoinAsString(", ")
);
}
}
public class ProviderInfoViewModel
{
public string ProviderName { get; set; }
public string ProviderKey { get; set; }
}
}
}

@ -0,0 +1,2 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Volo.Abp.AspNetCore.Mvc.UI.Bootstrap

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:55926/",
"sslPort": 0
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.Abp.PermissionManagement.Web": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "http://localhost:55927/"
}
}
}

@ -0,0 +1,25 @@
using System.Collections.Generic;
namespace Volo.Abp.PermissionManagement.Web.Utils
{
public class FlatTreeDepthFinder<T>
where T : class, IFlatTreeItem
{
public void SetDepths(List<T> items)
{
SetDepths(items, null, 0);
}
private static void SetDepths(List<T> items, string currentParent, int currentDepth)
{
foreach (var item in items)
{
if (item.ParentName == currentParent)
{
item.Depth = currentDepth;
SetDepths(items, item.Name, currentDepth + 1);
}
}
}
}
}

@ -0,0 +1,11 @@
namespace Volo.Abp.PermissionManagement.Web.Utils
{
public interface IFlatTreeItem
{
string Name { get; }
string ParentName { get; }
int Depth { get; set; }
}
}

@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.Web</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.Web</PackageId>
<IsPackable>true</IsPackable>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<OutputType>Library</OutputType>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="wwwroot\**\*.*" />
<EmbeddedResource Include="Pages\**\*.cshtml" />
<EmbeddedResource Include="Localization\Resources\**\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.PermissionManagement.Application.Contracts\Volo.Abp.PermissionManagement.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.AspNetCore.Mvc.UI.Bootstrap\Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.AutoMapper\Volo.Abp.AutoMapper.csproj" />
</ItemGroup>
</Project>

@ -0,0 +1,54 @@
var abp = abp || {};
(function ($) {
abp.modals = abp.modals || {};
abp.modals.PermissionManagement = function () {
function checkParents($tab, $checkBox) {
var parentName = $checkBox.closest('.form-check').attr('data-parent-name');
if (!parentName) {
return;
}
$tab.find('.form-check')
.filter('[data-permission-name="' + parentName + '"]')
.find('input[type="checkbox"]')
.each(function() {
var $parent = $(this);
$parent.prop('checked', true);
checkParents($tab, $parent);
});
}
function uncheckChildren($tab, $checkBox) {
var permissionName = $checkBox.closest('.form-check').attr('data-permission-name');
if (!permissionName) {
return;
}
$tab.find('.form-check')
.filter('[data-parent-name="' + permissionName + '"]')
.find('input[type="checkbox"]')
.each(function () {
var $child = $(this);
$child.prop('checked', false);
uncheckChildren($tab, $child);
});
}
this.initDom = function($el) {
$el.find('.tab-pane').each(function () {
var $tab = $(this);
$tab.find('input[type="checkbox"]').each(function () {
var $checkBox = $(this);
$checkBox.change(function () {
if ($checkBox.is(':checked')) {
checkParents($tab, $checkBox);
} else {
uncheckChildren($tab, $checkBox);
}
});
});
});
};
};
})(jQuery);

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.EntityFrameworkCore.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\Volo.Abp.PermissionManagement.TestBase\Volo.Abp.PermissionManagement.TestBase.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
</ItemGroup>
</Project>

@ -0,0 +1,37 @@
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
using Volo.Abp.Uow;
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
[DependsOn(
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementTestBaseModule))]
public class AbpPermissionManagementEntityFrameworkCoreTestModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkInMemoryDatabase();
var databaseName = Guid.NewGuid().ToString();
services.Configure<AbpDbContextOptions>(options =>
{
options.Configure(context =>
{
context.DbContextOptions.UseInMemoryDatabase(databaseName);
});
});
services.Configure<UnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions
});
services.AddAssemblyOf<AbpPermissionManagementEntityFrameworkCoreTestModule>();
}
}
}

@ -0,0 +1,7 @@
namespace Volo.Abp.PermissionManagement.EntityFrameworkCore
{
public class PermissionGrantRepository_Tests : PermissionGrantRepository_Tests<AbpPermissionManagementEntityFrameworkCoreTestModule>
{
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.MongoDB.Tests</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.MongoDB.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.PermissionManagement.MongoDB\Volo.Abp.PermissionManagement.MongoDB.csproj" />
<ProjectReference Include="..\Volo.Abp.PermissionManagement.TestBase\Volo.Abp.PermissionManagement.TestBase.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
<PackageReference Include="Mongo2Go" Version="2.2.1" />
</ItemGroup>
</Project>

@ -0,0 +1,33 @@
using Microsoft.Extensions.DependencyInjection;
using Mongo2Go;
using Volo.Abp.Data;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.MongoDB;
namespace Volo.Abp.PermissionManagement.MongoDb
{
[DependsOn(
typeof(AbpPermissionManagementMongoDbModule),
typeof(AbpPermissionManagementTestBaseModule))]
public class AbpPermissionManagementMongoDbTestModule : AbpModule
{
private MongoDbRunner _mongoDbRunner;
public override void ConfigureServices(IServiceCollection services)
{
_mongoDbRunner = MongoDbRunner.Start();
services.Configure<DbConnectionOptions>(options =>
{
options.ConnectionStrings.Default = _mongoDbRunner.ConnectionString;
});
services.AddAssemblyOf<AbpPermissionManagementMongoDbTestModule>();
}
public override void OnApplicationShutdown(ApplicationShutdownContext context)
{
_mongoDbRunner.Dispose();
}
}
}

@ -0,0 +1,7 @@
namespace Volo.Abp.PermissionManagement.MongoDb
{
public class PermissionGrantRepository_Tests : PermissionGrantRepository_Tests<AbpPermissionManagementMongoDbTestModule>
{
}
}

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.TestBase</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.TestBase</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\abp\src\Volo.Abp.TestBase\Volo.Abp.TestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.PermissionManagement.Domain\Volo.Abp.PermissionManagement.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
<PackageReference Include="NSubstitute" Version="3.1.0" />
<PackageReference Include="Shouldly" Version="3.0.0" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.extensibility.execution" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
</ItemGroup>
</Project>

@ -0,0 +1,40 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement
{
[DependsOn(
typeof(AbpPermissionManagementDomainModule),
typeof(AbpAutofacModule),
typeof(AbpTestBaseModule)
)]
public class AbpPermissionManagementTestBaseModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.Configure<PermissionOptions>(options =>
{
options.DefinitionProviders.Add<TestPermissionDefinitionProvider>();
});
services.AddAssemblyOf<AbpPermissionManagementTestBaseModule>();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
SeedTestData(context);
}
private static void SeedTestData(ApplicationInitializationContext context)
{
using (var scope = context.ServiceProvider.CreateScope())
{
scope.ServiceProvider
.GetRequiredService<PermissionTestDataBuilder>()
.Build();
}
}
}
}

@ -0,0 +1,36 @@
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Modularity;
using Xunit;
namespace Volo.Abp.PermissionManagement
{
public abstract class PermissionGrantRepository_Tests<TStartupModule> : PermissionManagementTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
protected IPermissionGrantRepository PermissionGrantRepository { get; }
protected PermissionGrantRepository_Tests()
{
PermissionGrantRepository = GetRequiredService<IPermissionGrantRepository>();
}
[Fact]
public async Task FindAsync()
{
(await PermissionGrantRepository.FindAsync("MyPermission1", UserPermissionValueProvider.ProviderName, PermissionTestDataBuilder.User1Id.ToString())).ShouldNotBeNull();
(await PermissionGrantRepository.FindAsync("Undefined-Permission", UserPermissionValueProvider.ProviderName, PermissionTestDataBuilder.User1Id.ToString())).ShouldBeNull();
(await PermissionGrantRepository.FindAsync("MyPermission1", "Undefined-Provider", "Unknown-Id")).ShouldBeNull();
}
[Fact]
public async Task GetListAsync()
{
var permissionGrants = await PermissionGrantRepository.GetListAsync(UserPermissionValueProvider.ProviderName, PermissionTestDataBuilder.User1Id.ToString());
permissionGrants.ShouldContain(p => p.Name == "MyPermission1");
}
}
}

@ -0,0 +1,13 @@
using Volo.Abp.Modularity;
namespace Volo.Abp.PermissionManagement
{
public abstract class PermissionManagementTestBase<TStartupModule> : AbpIntegratedTest<TStartupModule>
where TStartupModule : IAbpModule
{
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
}
}

@ -0,0 +1,34 @@
using System;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
namespace Volo.Abp.PermissionManagement
{
public class PermissionTestDataBuilder : ITransientDependency
{
public static Guid User1Id { get; } = Guid.NewGuid();
public static Guid User2Id { get; } = Guid.NewGuid();
private readonly IPermissionGrantRepository _permissionGrantRepository;
private readonly IGuidGenerator _guidGenerator;
public PermissionTestDataBuilder(IGuidGenerator guidGenerator, IPermissionGrantRepository permissionGrantRepository)
{
_guidGenerator = guidGenerator;
_permissionGrantRepository = permissionGrantRepository;
}
public void Build()
{
_permissionGrantRepository.Insert(
new PermissionGrant(
_guidGenerator.Create(),
"MyPermission1",
UserPermissionValueProvider.ProviderName,
User1Id.ToString()
)
);
}
}
}

@ -0,0 +1,17 @@
using Volo.Abp.Authorization.Permissions;
namespace Volo.Abp.PermissionManagement
{
public class TestPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var testGroup = context.AddGroup("TestGroup");
testGroup.AddPermission("MyPermission1");
var myPermission2 = testGroup.AddPermission("MyPermission2");
myPermission2.AddChild("MyPermission2.ChildPermission1");
}
}
}

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<AssemblyName>Volo.Abp.PermissionManagement.Tests</AssemblyName>
<PackageId>Volo.Abp.PermissionManagement.Tests</PackageId>
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.PermissionManagement.EntityFrameworkCore\Volo.Abp.PermissionManagement.EntityFrameworkCore.csproj" />
<ProjectReference Include="..\Volo.Abp.PermissionManagement.TestBase\Volo.Abp.PermissionManagement.TestBase.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="2.1.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
</ItemGroup>
</Project>

@ -0,0 +1,38 @@
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
using Volo.Abp.PermissionManagement.EntityFrameworkCore;
using Volo.Abp.Uow;
namespace Volo.Abp.PermissionManagement
{
[DependsOn(
typeof(AbpPermissionManagementEntityFrameworkCoreModule),
typeof(AbpPermissionManagementTestBaseModule))]
public class AbpPermissionManagementTestModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
{
services.AddEntityFrameworkInMemoryDatabase();
var databaseName = Guid.NewGuid().ToString();
services.Configure<AbpDbContextOptions>(options =>
{
options.Configure(context =>
{
context.DbContextOptions.UseInMemoryDatabase(databaseName);
});
});
services.Configure<UnitOfWorkDefaultOptions>(options =>
{
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; //EF in-memory database does not support transactions
});
services.AddAssemblyOf<AbpPermissionManagementTestModule>();
}
}
}

@ -0,0 +1,59 @@
using System;
using System.Security.Claims;
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Security.Claims;
using Xunit;
namespace Volo.Abp.PermissionManagement
{
public class PermissionChecker_User_Tests : PermissionTestBase
{
private readonly IPermissionChecker _permissionChecker;
public PermissionChecker_User_Tests()
{
_permissionChecker = GetRequiredService<IPermissionChecker>();
}
[Fact]
public async Task Should_Return_True_For_Granted_Current_User()
{
(await _permissionChecker.IsGrantedAsync(
CreatePrincipal(PermissionTestDataBuilder.User1Id),
"MyPermission1"
)).ShouldBeTrue();
}
[Fact]
public async Task Should_Return_False_For_Non_Granted_Current_User()
{
(await _permissionChecker.IsGrantedAsync(
CreatePrincipal(PermissionTestDataBuilder.User2Id),
"MyPermission1"
)).ShouldBeFalse();
}
[Fact]
public async Task Should_Return_False_For_Current_User_If_Anonymous()
{
(await _permissionChecker.IsGrantedAsync(
CreatePrincipal(null),
"MyPermission1"
)).ShouldBeFalse();
}
private static ClaimsPrincipal CreatePrincipal(Guid? userId)
{
var claimsIdentity = new ClaimsIdentity();
if (userId != null)
{
claimsIdentity.AddClaim(new Claim(AbpClaimTypes.UserId, userId.ToString()));
}
return new ClaimsPrincipal(claimsIdentity);
}
}
}

@ -0,0 +1,31 @@
using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Authorization.Permissions;
using Xunit;
namespace Volo.Abp.PermissionManagement
{
public class PermissionChecker_Basic_Tests : PermissionTestBase
{
private readonly IPermissionChecker _permissionChecker;
public PermissionChecker_Basic_Tests()
{
_permissionChecker = GetRequiredService<IPermissionChecker>();
}
[Fact]
public async Task Should_Throw_Exception_If_Permission_Is_Not_Defined()
{
await Assert.ThrowsAsync<AbpException>(async () =>
await _permissionChecker.IsGrantedAsync("UndefinedPermissionName")
);
}
[Fact]
public async Task Should_Return_False_As_Default_For_Any_Permission()
{
(await _permissionChecker.IsGrantedAsync("MyPermission1")).ShouldBeFalse();
}
}
}

@ -0,0 +1,24 @@
using System;
using Volo.Abp.PermissionManagement.EntityFrameworkCore;
namespace Volo.Abp.PermissionManagement
{
public abstract class PermissionTestBase : PermissionManagementTestBase<AbpPermissionManagementTestModule>
{
protected virtual void UsingDbContext(Action<IPermissionManagementDbContext> action)
{
using (var dbContext = GetRequiredService<IPermissionManagementDbContext>())
{
action.Invoke(dbContext);
}
}
protected virtual T UsingDbContext<T>(Func<IPermissionManagementDbContext, T> action)
{
using (var dbContext = GetRequiredService<IPermissionManagementDbContext>())
{
return action.Invoke(dbContext);
}
}
}
}
Loading…
Cancel
Save