Browse Source

Implement application finder and resource permission management providers

pull/24515/head
maliming 9 months ago
parent
commit
7050ef95c2
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 10
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/ApplicationFinderResult.cs
  2. 12
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/IApplicationFinder.cs
  3. 46
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationFinder.cs
  4. 4
      modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/IOpenIddictApplicationRepository.cs
  5. 7
      modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Applications/EfCoreOpenIddictApplicationRepository.cs
  6. 9
      modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Applications/MongoOpenIddictApplicationRepository.cs
  7. 8
      modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationPermissionManagementProvider.cs
  8. 59
      modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionManagementProvider.cs
  9. 45
      modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs

10
modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/ApplicationFinderResult.cs

@ -0,0 +1,10 @@
using System;
namespace Volo.Abp.OpenIddict.Applications;
public class ApplicationFinderResult
{
public Guid Id { get; set; }
public string ClientId { get; set; }
}

12
modules/openiddict/src/Volo.Abp.OpenIddict.Domain.Shared/Volo/Abp/OpenIddict/Applications/IApplicationFinder.cs

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Volo.Abp.OpenIddict.Applications;
public interface IApplicationFinder
{
Task<List<ApplicationFinderResult>> SearchAsync(string filter, int page = 1);
Task<List<ApplicationFinderResult>> SearchByIdsAsync(Guid[] ids);
}

46
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/AbpApplicationFinder.cs

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
namespace Volo.Abp.OpenIddict.Applications;
public class AbpApplicationFinder : IApplicationFinder, ITransientDependency
{
protected IOpenIddictApplicationRepository ApplicationRepository { get; }
public AbpApplicationFinder(IOpenIddictApplicationRepository applicationRepository)
{
ApplicationRepository = applicationRepository;
}
public virtual async Task<List<ApplicationFinderResult>> SearchAsync(string filter, int page = 1)
{
using (ApplicationRepository.DisableTracking())
{
page = page < 1 ? 1 : page;
var applications = await ApplicationRepository.GetListAsync(nameof(OpenIddictApplication.ClientId), filter: filter, skipCount: (page - 1) * 10, maxResultCount: 10);
return applications.Select(x => new ApplicationFinderResult
{
Id = x.Id,
ClientId = x.ClientId
}).ToList();
}
}
public virtual async Task<List<ApplicationFinderResult>> SearchByIdsAsync(Guid[] ids)
{
using (ApplicationRepository.DisableTracking())
{
var applications = await ApplicationRepository.GetListByIdsAsync(ids);
return applications.Select(x => new ApplicationFinderResult
{
Id = x.Id,
ClientId = x.ClientId
}).ToList();
}
}
}

4
modules/openiddict/src/Volo.Abp.OpenIddict.Domain/Volo/Abp/OpenIddict/Applications/IOpenIddictApplicationRepository.cs

@ -11,7 +11,7 @@ public interface IOpenIddictApplicationRepository : IBasicRepository<OpenIddictA
Task<List<OpenIddictApplication>> GetListAsync(string sorting, int skipCount, int maxResultCount, string filter = null, CancellationToken cancellationToken = default);
Task<long> GetCountAsync(string filter = null, CancellationToken cancellationToken = default);
Task<OpenIddictApplication> FindByClientIdAsync(string clientId, CancellationToken cancellationToken = default);
Task<List<OpenIddictApplication>> FindByPostLogoutRedirectUriAsync(string address, CancellationToken cancellationToken = default);
@ -19,4 +19,6 @@ public interface IOpenIddictApplicationRepository : IBasicRepository<OpenIddictA
Task<List<OpenIddictApplication>> FindByRedirectUriAsync(string address, CancellationToken cancellationToken = default);
Task<List<OpenIddictApplication>> ListAsync(int? count, int? offset, CancellationToken cancellationToken = default);
Task<List<OpenIddictApplication>> GetListByIdsAsync(Guid[] ids, CancellationToken cancellationToken = default);
}

7
modules/openiddict/src/Volo.Abp.OpenIddict.EntityFrameworkCore/Volo/Abp/OpenIddict/Applications/EfCoreOpenIddictApplicationRepository.cs

@ -62,4 +62,11 @@ public class EfCoreOpenIddictApplicationRepository : EfCoreRepository<IOpenIddic
.TakeIf<OpenIddictApplication, IQueryable<OpenIddictApplication>>(count.HasValue, count)
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<OpenIddictApplication>> GetListByIdsAsync(Guid[] ids, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => ids.Contains(x.Id))
.ToListAsync(GetCancellationToken(cancellationToken));
}
}

9
modules/openiddict/src/Volo.Abp.OpenIddict.MongoDB/Volo/Abp/OpenIddict/Applications/MongoOpenIddictApplicationRepository.cs

@ -17,7 +17,7 @@ public class MongoOpenIddictApplicationRepository : MongoDbRepository<OpenIddict
public MongoOpenIddictApplicationRepository(IMongoDbContextProvider<OpenIddictMongoDbContext> dbContextProvider) : base(dbContextProvider)
{
}
public virtual async Task<List<OpenIddictApplication>> GetListAsync(string sorting, int skipCount, int maxResultCount, string filter = null,
CancellationToken cancellationToken = default)
{
@ -64,4 +64,11 @@ public class MongoOpenIddictApplicationRepository : MongoDbRepository<OpenIddict
.TakeIf<OpenIddictApplication, IQueryable<OpenIddictApplication>>(count.HasValue, count)
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<OpenIddictApplication>> GetListByIdsAsync(Guid[] ids, CancellationToken cancellationToken = default)
{
return await (await GetQueryableAsync(cancellationToken))
.Where(x => ids.Contains(x.Id))
.ToListAsync(GetCancellationToken(cancellationToken));
}
}

8
modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationPermissionManagementProvider.cs

@ -29,6 +29,14 @@ public class ApplicationPermissionManagementProvider : PermissionManagementProvi
}
}
public override Task<MultiplePermissionValueProviderGrantInfo> CheckAsync(string[] names, string providerName, string providerKey)
{
using (CurrentTenant.Change(null))
{
return base.CheckAsync(names, providerName, providerKey);
}
}
protected override Task GrantAsync(string name, string providerKey)
{
using (CurrentTenant.Change(null))

59
modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionManagementProvider.cs

@ -0,0 +1,59 @@
using System.Threading.Tasks;
using Volo.Abp.Authorization.Permissions.Resources;
using Volo.Abp.Guids;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.PermissionManagement.OpenIddict;
public class ApplicationResourcePermissionManagementProvider : ResourcePermissionManagementProvider
{
public override string Name => ClientResourcePermissionValueProvider.ProviderName;
public ApplicationResourcePermissionManagementProvider(
IResourcePermissionGrantRepository resourcePermissionGrantRepository,
IGuidGenerator guidGenerator,
ICurrentTenant currentTenant)
: base(resourcePermissionGrantRepository, guidGenerator, currentTenant)
{
}
public override Task<ResourcePermissionValueProviderGrantInfo> CheckAsync(string name, string resourceName,string resourceKey, string providerName, string providerKey)
{
using (CurrentTenant.Change(null))
{
return base.CheckAsync(name, resourceName, resourceKey, providerName, providerKey);
}
}
public override Task<MultipleResourcePermissionValueProviderGrantInfo> CheckAsync(string[] names, string resourceName, string resourceKey, string providerName, string providerKey)
{
using (CurrentTenant.Change(null))
{
return base.CheckAsync(names, resourceName, resourceKey, providerName, providerKey);
}
}
public override Task SetAsync(string name, string resourceName,string resourceKey, string providerKey, bool isGranted)
{
using (CurrentTenant.Change(null))
{
return base.SetAsync(name, resourceName, resourceKey, providerKey, isGranted);
}
}
protected override async Task GrantAsync(string name, string resourceName, string resourceKey, string providerKey)
{
using (CurrentTenant.Change(null))
{
await base.GrantAsync(name, resourceName, resourceKey, providerKey);
}
}
protected override Task RevokeAsync(string name, string resourceName,string resourceKey, string providerKey)
{
using (CurrentTenant.Change(null))
{
return base.RevokeAsync(name, resourceName, resourceKey, providerKey);
}
}
}

45
modules/openiddict/src/Volo.Abp.PermissionManagement.Domain.OpenIddict/Volo/Abp/PermissionManagement/OpenIddict/ApplicationResourcePermissionProviderKeyLookupService.cs

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using OpenIddict.Abstractions;
using Volo.Abp.Authorization.Permissions.Resources;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.OpenIddict.Applications;
namespace Volo.Abp.PermissionManagement.OpenIddict;
public class ApplicationResourcePermissionProviderKeyLookupService : IResourcePermissionProviderKeyLookupService, ITransientDependency
{
public string Name => ClientResourcePermissionValueProvider.ProviderName;
public ILocalizableString DisplayName { get; }
protected IApplicationFinder ApplicationFinder { get; }
public ApplicationResourcePermissionProviderKeyLookupService(IApplicationFinder applicationFinder)
{
ApplicationFinder = applicationFinder;
DisplayName = LocalizableString.Create<OpenIddictResources>(nameof(ApplicationResourcePermissionProviderKeyLookupService));
}
public virtual async Task<List<ResourcePermissionProviderKeyInfo>> SearchAsync(string filter = null, int page = 1, CancellationToken cancellationToken = default)
{
var users = await ApplicationFinder.SearchAsync(filter, page);
return users.Select(u => new ResourcePermissionProviderKeyInfo(u.Id.ToString(), u.ClientId)).ToList();
}
public virtual async Task<List<ResourcePermissionProviderKeyInfo>> SearchAsync(string[] keys, CancellationToken cancellationToken = default)
{
var ids = keys
.Select(key => Guid.TryParse(key, out var id) ? (Guid?)id : null)
.Where(id => id.HasValue)
.Select(id => id.Value)
.Distinct()
.ToArray();
var users = await ApplicationFinder.SearchByIdsAsync(ids.ToArray());
return users.Select(u => new ResourcePermissionProviderKeyInfo(u.Id.ToString(), u.ClientId)).ToList();
}
}
Loading…
Cancel
Save