diff --git a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs
index 8f145b4987..807269f72e 100644
--- a/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs
+++ b/src/Volo.Abp.Permissions/Volo/Abp/Permissions/PermissionDefinition.cs
@@ -22,7 +22,10 @@
public PermissionDefinition CreateChild(string name)
{
- return new PermissionDefinition(name) {Parent = this};
+ return new PermissionDefinition(name)
+ {
+ Parent = this
+ };
}
}
}
\ No newline at end of file
diff --git a/src/Volo.Abp.Session/Volo.Abp.Session.csproj b/src/Volo.Abp.Session/Volo.Abp.Session.csproj
index 6aef78ea80..6ecc09159c 100644
--- a/src/Volo.Abp.Session/Volo.Abp.Session.csproj
+++ b/src/Volo.Abp.Session/Volo.Abp.Session.csproj
@@ -15,6 +15,7 @@
+
diff --git a/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs b/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs
new file mode 100644
index 0000000000..441d109c31
--- /dev/null
+++ b/src/Volo.Abp.Session/Volo/Abp/Permissions/UserSettingManagerExtensions.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using JetBrains.Annotations;
+using Volo.Abp.Session;
+
+namespace Volo.Abp.Permissions
+{
+ public static class UserPermissionManagerExtensions
+ {
+ public static Task IsGrantedForUserAsync(this IPermissionManager permissionManager, [NotNull] string name, Guid userId, bool fallback = true)
+ {
+ return permissionManager.IsGrantedAsync(name, UserPermissionValueProvider.ProviderName, userId.ToString(), fallback);
+ }
+
+ public static Task IsGrantedForCurrentUserAsync(this IPermissionManager permissionManager, [NotNull] string name, bool fallback = true)
+ {
+ return permissionManager.IsGrantedAsync(name, UserPermissionValueProvider.ProviderName, null, fallback);
+ }
+
+ public static Task> GetAllForUserAsync(this IPermissionManager permissionManager, Guid userId, bool fallback = true)
+ {
+ return permissionManager.GetAllAsync(UserPermissionValueProvider.ProviderName, userId.ToString(), fallback);
+ }
+
+ public static Task> GetAllForCurrentUserAsync(this IPermissionManager permissionManager, bool fallback = true)
+ {
+ return permissionManager.GetAllAsync(UserPermissionValueProvider.ProviderName, null, fallback);
+ }
+
+ public static Task SetForUserAsync(this IPermissionManager permissionManager, Guid userId, [NotNull] string name, bool? isGranted, bool forceToSet = false)
+ {
+ return permissionManager.SetAsync(name, isGranted, UserPermissionValueProvider.ProviderName, userId.ToString(), forceToSet);
+ }
+
+ public static Task SetForCurrentUserAsync(this IPermissionManager permissionManager, [NotNull] string name, bool? isGranted, bool forceToSet = false)
+ {
+ return permissionManager.SetAsync(name, isGranted, UserPermissionValueProvider.ProviderName, null, forceToSet);
+ }
+ }
+}
diff --git a/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs b/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs
index 33cc5e2a88..08fbad5d03 100644
--- a/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs
+++ b/src/Volo.Abp.Session/Volo/Abp/Session/AbpSessionModule.cs
@@ -1,5 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Modularity;
+using Volo.Abp.Permissions;
using Volo.Abp.Security;
using Volo.Abp.Settings;
@@ -7,6 +8,7 @@ namespace Volo.Abp.Session
{
[DependsOn(typeof(AbpSecurityModule))]
[DependsOn(typeof(AbpSettingsModule))]
+ [DependsOn(typeof(AbpPermissionsModule))]
public class AbpSessionModule : AbpModule
{
public override void ConfigureServices(IServiceCollection services)
@@ -16,6 +18,11 @@ namespace Volo.Abp.Session
options.ValueProviders.Add();
});
+ services.Configure(options =>
+ {
+ options.ValueProviders.Add();
+ });
+
services.AddAssemblyOf();
}
}
diff --git a/src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs b/src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs
new file mode 100644
index 0000000000..25c8fa8bf0
--- /dev/null
+++ b/src/Volo.Abp.Session/Volo/Abp/Session/UserPermissionValueProvider.cs
@@ -0,0 +1,45 @@
+using System.Threading.Tasks;
+using Volo.Abp.Permissions;
+
+namespace Volo.Abp.Session
+{
+ public class UserPermissionValueProvider : PermissionValueProvider
+ {
+ public const string ProviderName = "User";
+
+ public override string Name => ProviderName;
+
+ protected ICurrentUser CurrentUser { get; }
+
+ public UserPermissionValueProvider(IPermissionStore permissionStore, ICurrentUser currentUser)
+ : base(permissionStore)
+ {
+ CurrentUser = currentUser;
+ }
+
+ public override async Task IsGrantedAsync(PermissionDefinition permission, string providerKey)
+ {
+ if (providerKey == null)
+ {
+ if (CurrentUser.Id == null)
+ {
+ return null;
+ }
+
+ providerKey = CurrentUser.Id.ToString();
+ }
+
+ return await PermissionStore.IsGrantedAsync(permission.Name, Name, providerKey);
+ }
+
+ public override Task SetAsync(PermissionDefinition permission, bool isGranted, string providerKey)
+ {
+ return PermissionStore.SetAsync(permission.Name, isGranted, Name, providerKey);
+ }
+
+ public override Task ClearAsync(PermissionDefinition permission, string providerKey)
+ {
+ return PermissionStore.DeleteAsync(permission.Name, Name, providerKey);
+ }
+ }
+}
diff --git a/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs b/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs
index 12ea477ed8..64e3e10922 100644
--- a/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs
+++ b/src/Volo.Abp/Volo/Abp/AbpCommonModule.cs
@@ -7,6 +7,7 @@ using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
+using Volo.Abp.Permissions;
using Volo.Abp.Security;
using Volo.Abp.Session;
using Volo.Abp.Settings;
@@ -22,6 +23,7 @@ namespace Volo.Abp
[DependsOn(typeof(AbpSecurityModule))]
[DependsOn(typeof(AbpSessionModule))]
[DependsOn(typeof(AbpSettingsModule))]
+ [DependsOn(typeof(AbpPermissionsModule))]
[DependsOn(typeof(AbpDataModule))]
[DependsOn(typeof(AbpJsonModule))]
[DependsOn(typeof(AbpVirtualFileSystemModule))]
diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs
index 4556b19a12..6eba78d9b7 100644
--- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs
+++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/AbpPermissionTestDataBuilder.cs
@@ -1,13 +1,14 @@
using System;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Guids;
+using Volo.Abp.Session;
namespace Volo.Abp.Permissions
{
public class AbpPermissionTestDataBuilder : ITransientDependency
{
- public static Guid User1Id = Guid.NewGuid();
- public static Guid User2Id = Guid.NewGuid();
+ public static Guid User1Id { get; } = Guid.NewGuid();
+ public static Guid User2Id { get; } = Guid.NewGuid();
private readonly IPermissionGrantRepository _permissionGrantRepository;
private readonly IGuidGenerator _guidGenerator;
@@ -20,7 +21,15 @@ namespace Volo.Abp.Permissions
public void Build()
{
-
+ _permissionGrantRepository.Insert(
+ new PermissionGrant(
+ _guidGenerator.Create(),
+ "MyPermission1",
+ true,
+ UserPermissionValueProvider.ProviderName,
+ User1Id.ToString()
+ )
+ );
}
}
}
\ No newline at end of file
diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs
index 619d7dee2f..3095ddf911 100644
--- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs
+++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_Basic_Tests.cs
@@ -14,9 +14,17 @@ namespace Volo.Abp.Permissions
}
[Fact]
- public async Task Test1()
+ public async Task Should_Throw_Exception_If_Permission_Is_Not_Defined()
{
- _permissionManager.ShouldNotBeNull();
+ await Assert.ThrowsAsync(async () =>
+ await _permissionManager.IsGrantedAsync("UndefinedPermissionName")
+ );
+ }
+
+ [Fact]
+ public async Task Should_Return_False_As_Default_For_Any_Permission()
+ {
+ (await _permissionManager.IsGrantedAsync("MyPermission1")).ShouldBeFalse();
}
}
}
diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs
new file mode 100644
index 0000000000..1174b65f36
--- /dev/null
+++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/PermissionManager_User_Tests.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using NSubstitute;
+using Shouldly;
+using Volo.Abp.Session;
+using Xunit;
+
+namespace Volo.Abp.Permissions
+{
+ public class PermissionManager_User_Tests : AbpPermissionTestBase
+ {
+ private readonly IPermissionManager _permissionManager;
+
+ private Guid? _currentUserId;
+
+ public PermissionManager_User_Tests()
+ {
+ _permissionManager = GetRequiredService();
+ }
+
+ protected override void AfterAddApplication(IServiceCollection services)
+ {
+ var currentUser = Substitute.For();
+ currentUser.Id.Returns(ci => _currentUserId);
+ services.AddSingleton(currentUser);
+ }
+
+ [Fact]
+ public async Task Should_Return_True_For_Granted_User()
+ {
+ (await _permissionManager.IsGrantedForUserAsync(
+ "MyPermission1",
+ AbpPermissionTestDataBuilder.User1Id
+ )).ShouldBeTrue();
+ }
+
+ [Fact]
+ public async Task Should_Return_True_For_Granted_Current_User()
+ {
+ _currentUserId = AbpPermissionTestDataBuilder.User1Id;
+
+ (await _permissionManager.IsGrantedForCurrentUserAsync(
+ "MyPermission1"
+ )).ShouldBeTrue();
+ }
+
+ [Fact]
+ public async Task Should_Return_False_For_Non_Granted_User()
+ {
+ (await _permissionManager.IsGrantedForUserAsync(
+ "MyPermission1",
+ AbpPermissionTestDataBuilder.User2Id
+ )).ShouldBeFalse();
+ }
+
+ [Fact]
+ public async Task Should_Return_False_For_Non_Granted_Current_User()
+ {
+ _currentUserId = AbpPermissionTestDataBuilder.User2Id;
+
+ (await _permissionManager.IsGrantedForCurrentUserAsync(
+ "MyPermission1"
+ )).ShouldBeFalse();
+ }
+
+ [Fact]
+ public async Task Should_Return_False_For_Current_User_If_Anonymous()
+ {
+ (await _permissionManager.IsGrantedForCurrentUserAsync(
+ "MyPermission1"
+ )).ShouldBeFalse();
+ }
+ }
+}
diff --git a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs
index de773c8f90..a8108aa344 100644
--- a/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs
+++ b/test/Volo.Abp.Permissions.Tests/Volo/Abp/Permissions/TestPermissionDefinitionProvider.cs
@@ -5,9 +5,8 @@
public override void Define(IPermissionDefinitionContext context)
{
var myPermission1 = new PermissionDefinition("MyPermission1");
- var myPermission2 = new PermissionDefinition("MyPermission2");
- context.Add(myPermission1, myPermission2);
+ context.Add(myPermission1);
}
}
}
\ No newline at end of file
diff --git a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs
index b97b322bc8..b7c2c95ce1 100644
--- a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs
+++ b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/AbpSettingTestDataBuilder.cs
@@ -7,8 +7,8 @@ namespace Volo.Abp.Settings
{
public class AbpSettingTestDataBuilder : ITransientDependency
{
- public static Guid User1Id = Guid.NewGuid();
- public static Guid User2Id = Guid.NewGuid();
+ public static Guid User1Id { get; } = Guid.NewGuid();
+ public static Guid User2Id { get; } = Guid.NewGuid();
private readonly ISettingRepository _settingRepository;
private readonly IGuidGenerator _guidGenerator;
diff --git a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs
index 47080a973a..7601c82d97 100644
--- a/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs
+++ b/test/Volo.Abp.Settings.Tests/Volo/Abp/Settings/SettingManager_User_Tests.cs
@@ -11,7 +11,7 @@ namespace Volo.Abp.Settings
{
public class SettingManager_User_Tests: AbpSettingsTestBase
{
- private Guid _currentUserId;
+ private Guid? _currentUserId;
private readonly ISettingManager _settingManager;