Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
103 commits
Select commit Hold shift + click to select a range
b535f42
Introduce IResourcePermissionChecker
hikalkan Nov 7, 2025
c175cfb
Merge branch 'dev' into resource-based-auth
hikalkan Nov 10, 2025
e5e25c5
Added GetGrantedResourceKeysAsync
hikalkan Nov 10, 2025
87e41a6
Added summaries
hikalkan Nov 10, 2025
ca61e7d
Reformat IPermissionManager
hikalkan Nov 10, 2025
8448bdd
Remove outdated comment
hikalkan Nov 10, 2025
e662b62
Create IResourcePermissionManager.cs
hikalkan Nov 10, 2025
74d6bdb
Add resource permission management interfaces and implementations
maliming Nov 11, 2025
4c35fc9
Add resource-based permission to PermissionDefinition system.
maliming Nov 11, 2025
fccc3f2
Add resource-based permission value providers
maliming Nov 11, 2025
22cfc5b
Refactor permission type to resource name
maliming Nov 11, 2025
859a4c3
Merge branch 'dev' into resource-based-auth
maliming Nov 12, 2025
a2d39ad
Implement resource-based permission management with new methods and c…
maliming Nov 13, 2025
f2e5cb7
Enhance resource permission management by adding provider name and ke…
maliming Nov 13, 2025
09675eb
Refactor GetPermissionsAsync method to return MultiplePermissionGrant…
maliming Nov 13, 2025
cdc3fdd
Implement `ResourcePermissionStore`.
maliming Nov 13, 2025
0c0cff7
Add resource permission grant repositories for EF Core and MongoDB
maliming Nov 13, 2025
90bf895
Implement `ResourcePermissionManager`.
maliming Nov 13, 2025
2f56610
Add resource permission checker and store extension methods for entit…
maliming Nov 13, 2025
b3706cf
Add resource permission management features and update API methods
maliming Nov 13, 2025
8bd08b9
Make constructor public in permission handler
maliming Nov 13, 2025
6be3559
Refactor permission management module
maliming Nov 15, 2025
39b60db
Refactor permission grant info types in role provider
maliming Nov 15, 2025
25f6877
feat(permission-management): add resource permission management features
maliming Nov 16, 2025
1398c8d
fix(permission-management): validate user ID parsing in role permissi…
maliming Nov 17, 2025
4b96a90
feat: Enhance user and role management with search capabilities and r…
maliming Nov 17, 2025
0e5cce3
feat(permission-management): update resource permission management mo…
maliming Nov 18, 2025
a14a53d
feat: Add SearchByIdsAsync methods for users and roles in Identity mo…
maliming Nov 18, 2025
2844e59
feat(permission-management): update resource permission handling and …
maliming Nov 18, 2025
8e7218f
Remove resource permissions modal and related actions from roles and …
maliming Nov 18, 2025
7eb5066
Remove resource permission management script from roles and users pages
maliming Nov 18, 2025
706ae23
Add 'ResourcePermissions' to English UI resources
maliming Nov 18, 2025
4698cf3
Remove TestPermissionDefinitionProvider and update localization keys …
maliming Nov 18, 2025
da213bf
Merge branch 'dev' into resource-based-auth
maliming Nov 18, 2025
bf8bfb9
Enhance permission management and localization for resource permissions
maliming Nov 18, 2025
185485d
Add localization for User and Role resource permission provider keys …
maliming Nov 18, 2025
286e312
Refactor permission retrieval methods and clean up unused model valid…
maliming Nov 18, 2025
908e51e
Add missing closing brackets in localization files for Czech and English
maliming Nov 19, 2025
7d5a988
Add resource management permissions and update authorization attribut…
maliming Nov 19, 2025
ba036ad
Fix form validation trigger on provider key change in resource permis…
maliming Nov 19, 2025
9f33eb0
Update modal footer buttons in permission management modals for consi…
maliming Nov 19, 2025
147d88c
Add localization for "NoResourceProviderKeyLookupServiceFound" messag…
maliming Nov 19, 2025
7cbc6c3
Implement resource permissions management with new interfaces and ext…
maliming Nov 19, 2025
c8c46c8
Add resource permission management to RoleUpdateEventHandler
maliming Nov 19, 2025
288578b
Refactor ResourcePermissionGrant properties and index for improved cl…
maliming Nov 19, 2025
c7413e6
Refactor permission group assertions in tests
maliming Nov 19, 2025
3925ba3
Refactor resource permission population logic
maliming Nov 20, 2025
621d126
Merge branch 'dev' into resource-based-auth
maliming Nov 20, 2025
0e6fa6b
Add "NoResourcePermissionFound" localization key and update related m…
maliming Nov 20, 2025
f30c53b
Add ResourcePermissionGrant cache invalidator
maliming Nov 20, 2025
d278998
Add resource permission value provider tests
maliming Nov 20, 2025
da995d4
Add resource permission checker tests and update permission definitions
maliming Nov 20, 2025
d83b9b3
Add resource permission tests to StaticPermissionDefinitionStore
maliming Nov 20, 2025
9edc439
Prevent child permissions for resource permissions
maliming Nov 20, 2025
e42917d
Add resource permission grant repository tests
maliming Nov 20, 2025
efaeebf
Implement resource permission deletion in Role and User event handlers
maliming Nov 21, 2025
8c17421
Add resource permission manager extensions for roles and users
maliming Nov 21, 2025
7d6e3d7
Add new tests for user and role search methods
maliming Nov 21, 2025
21a303c
Return empty list for empty filter in search methods
maliming Nov 21, 2025
3679b0b
Add `ResourcePermissionStore_Tests`
maliming Nov 21, 2025
75230d9
Add unit tests for ResourcePermissionChecker
maliming Nov 21, 2025
5bb3ac0
Add tests for ResourcePermissionGrant cache behavior
maliming Nov 21, 2025
470cfda
Support resource permissions in permission serialization
maliming Nov 21, 2025
843a3da
Add resource permission management provider and tests
maliming Nov 21, 2025
4628196
Add pagination support to resource permission search methods
maliming Nov 21, 2025
2562500
Update pagination logic in permission modal
maliming Nov 21, 2025
f5404df
Introduce IKeyedObject and unify object key access
hikalkan Nov 27, 2025
d425c0f
Add GetObjectKey method to MyEntity class
hikalkan Nov 27, 2025
5c93eb0
Add tests for KeyedObjectHelper composite key methods
hikalkan Nov 27, 2025
0658ad8
Remove JetBrains.Annotations and improve formatting
hikalkan Nov 27, 2025
7500ec5
Make EntityResourcePermissionRequirementHandler
hikalkan Nov 27, 2025
c190580
Rename ResourcePermissionExtenstions class
hikalkan Nov 27, 2025
cea95ea
Merge branch 'dev' into resource-based-auth
maliming Nov 28, 2025
39abb23
Merge branch 'dev' into resource-based-auth
maliming Dec 5, 2025
49e79ce
Remove redundant permission management translations
maliming Dec 5, 2025
7048d03
Remove permission definition provider and permissions classes
maliming Dec 5, 2025
c7d7388
feat: add management permission to resource permissions and update re…
maliming Dec 5, 2025
9cd2fa7
Refactor permission group creation in test provider
maliming Dec 5, 2025
cffd874
refactor: update resource permission methods to include resourceName …
maliming Dec 6, 2025
ae06975
Add tests for duplicate and multiple resource permissions
maliming Dec 6, 2025
5579fb7
Rename ManagementPermission to ManagementPermissionName
maliming Dec 6, 2025
ad33653
Move KeyedObjectResourcePermission to Abp.Authorization
maliming Dec 6, 2025
64c09ac
Refactor permission app service for clarity
maliming Dec 6, 2025
ea32e2c
Enforce management permission checks for resource permissions
maliming Dec 6, 2025
d929e92
Grant TestEntityManagementPermission in FakePermissionStore
maliming Dec 6, 2025
be862df
Add test data for TestEntityManagementPermission
maliming Dec 6, 2025
cbf5b78
Merge branch 'dev' into resource-based-auth
hikalkan Dec 7, 2025
12b50b4
Remove management permission check from resource permissions
maliming Dec 8, 2025
349a08c
Update expected resource permissions count in test
maliming Dec 8, 2025
d8be0a9
Merge branch 'dev' into resource-based-auth
hikalkan Dec 11, 2025
9632923
Minor refactor
hikalkan Dec 11, 2025
4e9322c
Optimize permission checks using IPermissionChecker
maliming Dec 12, 2025
8b4f5ba
Unify 'ResourcePermissions' translation to 'Permissions'
maliming Dec 12, 2025
a280a8b
Update permission localization strings for clarity
maliming Dec 12, 2025
0d9720e
Remove redundant resource and provider localization strings from mult…
maliming Dec 12, 2025
ce9859a
Update resource permission localization and modals
maliming Dec 12, 2025
87632e8
Improve resource permission modal UX and fix heading
maliming Dec 13, 2025
534695d
Refactor role search methods to use names instead of IDs and update r…
maliming Dec 13, 2025
960f171
Sanitize HTML id attributes by removing dots
maliming Dec 13, 2025
2b8cbd4
Show resource display name in permission modal header
maliming Dec 14, 2025
224d14d
Update notification message on resource delete
maliming Dec 14, 2025
a2b60e9
Add providers to resource permission DTO and update usage
maliming Dec 14, 2025
6c22c9f
Fix permission filter order in resource modal
maliming Dec 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using Volo.Abp.Authorization.Permissions.Resources;
using Volo.Abp.Collections;

namespace Volo.Abp.Authorization.Permissions;
Expand All @@ -9,6 +10,8 @@ public class AbpPermissionOptions

public ITypeList<IPermissionValueProvider> ValueProviders { get; }

public ITypeList<IResourcePermissionValueProvider> ResourceValueProviders { get; }

public HashSet<string> DeletedPermissions { get; }

public HashSet<string> DeletedPermissionGroups { get; }
Expand All @@ -17,6 +20,7 @@ public AbpPermissionOptions()
{
DefinitionProviders = new TypeList<IPermissionDefinitionProvider>();
ValueProviders = new TypeList<IPermissionValueProvider>();
ResourceValueProviders = new TypeList<IResourcePermissionValueProvider>();

DeletedPermissions = new HashSet<string>();
DeletedPermissionGroups = new HashSet<string>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ PermissionDefinition AddPermission(
ILocalizableString? displayName = null,
MultiTenancySides multiTenancySide = MultiTenancySides.Both,
bool isEnabled = true);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System;
using JetBrains.Annotations;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;

namespace Volo.Abp.Authorization.Permissions;

Expand Down Expand Up @@ -46,4 +48,16 @@ PermissionGroupDefinition AddGroup(
/// <param name="name">Name of the permission</param>
/// </summary>
PermissionDefinition? GetPermissionOrNull(string name);

PermissionDefinition AddResourcePermission(
string name,
string resourceName,
string managementPermissionName,
ILocalizableString? displayName = null,
MultiTenancySides multiTenancySide = MultiTenancySides.Both,
bool isEnabled = true);

PermissionDefinition? GetResourcePermissionOrNull([NotNull] string resourceName, [NotNull] string name);

void RemoveResourcePermission([NotNull] string resourceName, [NotNull] string name);
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,14 @@ public interface IPermissionDefinitionManager

Task<PermissionDefinition?> GetOrNullAsync([NotNull] string name);

[ItemNotNull]
Task<PermissionDefinition> GetResourcePermissionAsync([NotNull]string resourceName, [NotNull] string name);

Task<PermissionDefinition?> GetResourcePermissionOrNullAsync([NotNull]string resourceName, [NotNull] string name);

Task<IReadOnlyList<PermissionDefinition>> GetPermissionsAsync();

Task<IReadOnlyList<PermissionDefinition>> GetResourcePermissionsAsync();

Task<IReadOnlyList<PermissionGroupDefinition>> GetGroupsAsync();
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ public interface IPermissionValueProvider
{
string Name { get; }

//TODO: Rename to GetResult? (CheckAsync throws exception by naming convention)
Task<PermissionGrantResult> CheckAsync(PermissionValueCheckContext context);

Task<MultiplePermissionGrantResult> CheckAsync(PermissionValuesCheckContext context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

namespace Volo.Abp.Authorization.Permissions;

public class PermissionDefinition :
public class PermissionDefinition :
IHasSimpleStateCheckers<PermissionDefinition>,
ICanAddChildPermission
{
Expand All @@ -16,6 +16,16 @@ public class PermissionDefinition :
/// </summary>
public string Name { get; }

/// <summary>
/// Resource name of the permission.
/// </summary>
public string? ResourceName { get; set; }

/// <summary>
/// Management permission of the resource permission.
/// </summary>
public string? ManagementPermissionName { get; set; }

/// <summary>
/// Parent of this permission if one exists.
/// If set, this permission can be granted only if parent is granted.
Expand Down Expand Up @@ -76,6 +86,19 @@ public object? this[string name] {
set => Properties[name] = value;
}

protected internal PermissionDefinition(
[NotNull] string name,
string resourceName,
string managementPermissionName,
ILocalizableString? displayName = null,
MultiTenancySides multiTenancySide = MultiTenancySides.Both,
bool isEnabled = true)
: this(name, displayName, multiTenancySide, isEnabled)
{
ResourceName = Check.NotNull(resourceName, nameof(resourceName));
ManagementPermissionName = Check.NotNull(managementPermissionName, nameof(managementPermissionName));
}

protected internal PermissionDefinition(
[NotNull] string name,
ILocalizableString? displayName = null,
Expand All @@ -99,6 +122,11 @@ public virtual PermissionDefinition AddChild(
MultiTenancySides multiTenancySide = MultiTenancySides.Both,
bool isEnabled = true)
{
if (ResourceName != null)
{
throw new AbpException($"Resource permission cannot have child permissions. Resource: {ResourceName}");
}

var child = new PermissionDefinition(
name,
displayName,
Expand All @@ -109,12 +137,12 @@ public virtual PermissionDefinition AddChild(
};

child[PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName] = this[PermissionDefinitionContext.KnownPropertyNames.CurrentProviderName];

_children.Add(child);

return child;
}

PermissionDefinition ICanAddChildPermission.AddPermission(
string name,
ILocalizableString? displayName = null,
Expand All @@ -124,7 +152,6 @@ PermissionDefinition ICanAddChildPermission.AddPermission(
return this.AddChild(name, displayName, multiTenancySide, isEnabled);
}


/// <summary>
/// Sets a property in the <see cref="Properties"/> dictionary.
/// This is a shortcut for nested calls on this object.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using JetBrains.Annotations;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy;

namespace Volo.Abp.Authorization.Permissions;

Expand All @@ -11,17 +13,20 @@ public class PermissionDefinitionContext : IPermissionDefinitionContext

public Dictionary<string, PermissionGroupDefinition> Groups { get; }

public List<PermissionDefinition> ResourcePermissions { get; }

internal IPermissionDefinitionProvider? CurrentProvider { get; set; }

public static class KnownPropertyNames
{
public const string CurrentProviderName = "_CurrentProviderName";
}

public PermissionDefinitionContext(IServiceProvider serviceProvider)
{
ServiceProvider = serviceProvider;
Groups = new Dictionary<string, PermissionGroupDefinition>();
ResourcePermissions = new List<PermissionDefinition>();
}

public virtual PermissionGroupDefinition AddGroup(
Expand All @@ -43,45 +48,31 @@ public virtual PermissionGroupDefinition AddGroup(
}

Groups[name] = group;

return group;
}

[NotNull]
public virtual PermissionGroupDefinition GetGroup([NotNull] string name)
{
var group = GetGroupOrNull(name);

if (group == null)
{
throw new AbpException($"Could not find a permission definition group with the given name: {name}");
}

return group;
return group ?? throw new AbpException($"Could not find a permission definition group with the given name: {name}");
}

public virtual PermissionGroupDefinition? GetGroupOrNull([NotNull] string name)
{
Check.NotNull(name, nameof(name));

if (!Groups.ContainsKey(name))
{
return null;
}

return Groups[name];
return Groups.GetOrDefault(name);
}

public virtual void RemoveGroup(string name)
{
Check.NotNull(name, nameof(name));

if (!Groups.ContainsKey(name))
if (!Groups.Remove(name))
{
throw new AbpException($"Not found permission group with name: {name}");
}

Groups.Remove(name);
}

public virtual PermissionDefinition? GetPermissionOrNull([NotNull] string name)
Expand All @@ -100,4 +91,58 @@ public virtual void RemoveGroup(string name)

return null;
}

public virtual PermissionDefinition AddResourcePermission(
string name,
string resourceName,
string managementPermissionName,
ILocalizableString? displayName = null,
MultiTenancySides multiTenancySide = MultiTenancySides.Both,
bool isEnabled = true)
{
Check.NotNull(name, nameof(name));
Check.NotNull(resourceName, nameof(resourceName));
Check.NotNull(managementPermissionName, nameof(managementPermissionName));

if (ResourcePermissions.Any(x => x.ResourceName == resourceName && x.Name == name))
{
throw new AbpException($"There is already an existing resource permission with name: {name} for resource: {resourceName}");
}

var permission = new PermissionDefinition(
name,
resourceName,
managementPermissionName,
displayName,
multiTenancySide,
isEnabled)
{
[KnownPropertyNames.CurrentProviderName] = CurrentProvider?.GetType().FullName
};

ResourcePermissions.Add(permission);

return permission;
}

public virtual PermissionDefinition? GetResourcePermissionOrNull([NotNull] string resourceName, [NotNull] string name)
{
Check.NotNull(resourceName, nameof(resourceName));
Check.NotNull(name, nameof(name));

return ResourcePermissions.FirstOrDefault(p => p.ResourceName == resourceName && p.Name == name);
}

public virtual void RemoveResourcePermission([NotNull] string resourceName, [NotNull] string name)
{
Check.NotNull(resourceName, nameof(resourceName));
Check.NotNull(name, nameof(name));

var resourcePermission = GetResourcePermissionOrNull(resourceName, name);
if (resourcePermission == null)
{
throw new AbpException($"Not found resource permission with name: {name} for resource: {resourceName}");
}
ResourcePermissions.Remove(resourcePermission);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Collections.Generic;

namespace Volo.Abp.Authorization.Permissions.Resources;

public interface IHasResourcePermissions : IKeyedObject
{
Dictionary<string, bool> ResourcePermissions { get; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System.Security.Claims;
using System.Threading.Tasks;

namespace Volo.Abp.Authorization.Permissions.Resources;

public interface IResourcePermissionChecker
{
Task<bool> IsGrantedAsync(
string name,
string resourceName,
string resourceKey
);

Task<bool> IsGrantedAsync(
ClaimsPrincipal? claimsPrincipal,
string name,
string resourceName,
string resourceKey
);

Task<MultiplePermissionGrantResult> IsGrantedAsync(
string[] names,
string resourceName,
string resourceKey
);

Task<MultiplePermissionGrantResult> IsGrantedAsync(
ClaimsPrincipal? claimsPrincipal,
string[] names,
string resourceName,
string resourceKey
);
}
Loading
Loading